一起使用SQL JOIN和UNION

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中的一个客户端可以有多个记录。

我已经尝试过正确和完全加入,但是一切都一样。

我在哪里错过这个问题?

谢谢您的帮助。

ype*_*eᵀᴹ 7

您可以尝试更换:

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)