【发布时间】:2011-10-28 07:01:10
【问题描述】:
好的,我很难理解为什么会出现以下行为。
我有一个“交易标头”表和“交易明细”表。对于某个函数,明细表需要进行一些规范化来提取“Remark”数据。每条明细记录中最多可以有 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;
我得到的结果集基于与 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
我得到的是这样的:
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
请记住,在 TranHeader 中可以有多个客户记录。
我尝试了正确的完全加入,但结果都一样。
我在哪里遗漏了问题?
感谢您的帮助。
【问题讨论】:
-
您使用的是什么关系型数据库?您能否举例说明预期的结果是什么?
-
为什么在 TranHeader 上使用左连接?确认一下,您的问题是 TranHeder 中的多条记录与在 Trandetail 中找到的一条记录相匹配?
-
Vache - MSSQL 2008 - 我将更新关于结果集的问题。 HLGEM,问题是我从 TranDetail 得到重复。一个客户端可能有多个标头交易,无论该数字是多少,交易细节记录都会乘以它。
-
也许你想要
UNION而不是UNION ALL。
标签: sql sql-server sql-server-2008 join union