nth*_*nth 7 sql sql-server union join sql-server-2008
好的,我很困惑为什么会出现以下行为。
我有一个“交易标头”表和“交易明细”表。对于某些功能,详细信息表需要一些规范化才能提取“备注”数据。每个详细记录中最多可以包含3个由TranRemark1,TranRemark2和TranRemark3列指定的注释。
我整理了以下查询,认为它可以工作,但返回的记录数不正确。
SELECT
b.ClientName,
a.TranID,
a.TranRemark1,
a.TranDateOfService,
a.TranPayment
FROM
(select TranRemark1, TranID from TranDetail
union all
select TranRemark2, TranID from TranDetail
union all
select TranRemark3, TranID from TranDetail) AS a
LEFT JOIN TranHeader AS b ON
b.TranID = a.TranID
WHERE a.TranRemark1 = @RemarkCode;
Run Code Online (Sandbox Code Playgroud)
我得到的结果集基于与ClientName匹配的TranHeader记录的数量,而不是与TranDetail中的where子句匹配的记录的数量。例如,如果客户“ Acme Inc.” 标头表中有3条记录,我使用上面的查询来查询注释代码“ 1234”(与TranDetail中只有1条记录匹配),结果集列出了正确的记录3次。
编辑 所以我希望从上面的例子中得到这样的结果集:
ClientName--TranID--TranRemark1--TranDateOfService--TranPayment
Acme Inc ADC11 1234 8-16-2011 45.11
Run Code Online (Sandbox Code Playgroud)
我得到的是:
ClientName--TranID--TranRemark1--TranDateOfService--TranPayment
Acme Inc ADC11 1234 8-16-2011 45.11
Acme Inc ADC11 1234 8-16-2011 45.11
Acme Inc ADC11 1234 8-16-2011 45.11
Run Code Online (Sandbox Code Playgroud)
请记住,TranHeader中的一个客户端可以有多个记录。
我已经尝试过正确和完全加入,但是一切都一样。
我在哪里错过这个问题?
谢谢您的帮助。
您可以尝试更换:
LEFT JOIN TranHeader AS b ON
b.TranID = a.TranID
WHERE a.TranRemark1 = @RemarkCode;
Run Code Online (Sandbox Code Playgroud)
与:
LEFT JOIN
( SELECT DISTINCT
TranId, ClientName
FROM TranHeader
) AS b ON
b.TranID = a.TranID
WHERE a.TranRemark1 = @RemarkCode;
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
53996 次 |
| 最近记录: |