【发布时间】:2016-07-15 18:30:59
【问题描述】:
我的 INNER JOIN 过滤掉了太多,或者我看不出有什么区别。
我正在尝试在同一台服务器上合并来自 2 个不同数据库的 2 个表。
我的第一步是找到所有匹配的值:
SELECT intl.*
FROM tblData intl
INNER JOIN [db].dbo.tblData us
ON intl.DataID = us.DataID
AND intl.AnotherID = us.AnotherID
AND intl.DataValue = us.DataValue
AND intl.TextValue = us.TextValue
AND intl.DefaultValue = us.DefaultValue
AND intl.RateValue = us.RateValue
AND intl.YetAnotherID = us.YetAnotherID
我检查了所有列,它们是相同的类型和相同的 varchar 值。所以这个查询应该带回所有匹配的值。
然而……事实并非如此。它只返回 200 多条记录,如果我在将 200 多条记录插入临时表后运行此查询:
SELECT intl.DataID
FROM tblData intl
LEFT JOIN TempDataTable TDT
ON TDT.DataID = intl.DataID
AND TDT.AnotherID = intl.AnotherID
AND TDT.DataValue = intl.DataValue
AND TDT.TextValue = intl.TextValue
AND TDT.DefaultValue = intl.DefaultValue
AND TDT.RateValue = intl.RateValue
AND TDT.YetAnotherID = intl.YetAnotherID
WHERE TDT.DataID IS NULL
此查询返回 1500 多行。
我对美国数据进行了类似的查询,发现了相同的差异(返回了 1500 多行)。
我查看了 1 条记录,只是想看看我是否能识别出一些奇怪的东西,我发现每个表(INTL 和 US)中的记录完全相同!
DataID: 1
AnotherID: 1
DataValue: NULL
TextValue: NORMAL
DefaultValue: 0
RateValue: NULL
YetAnotherID: 1
我想我的内部连接在结构上发现了两个表之间的差异,但我看不到它。
有什么想法会导致这种情况吗?
【问题讨论】:
-
可能是
NULL值。NULL不等于任何东西,甚至不等于另一个NULL。因此,在比较NULL列的地方,它将无法通过相等性检查,从而夸大了您的LEFT JOIN数字。 -
真的……我不知道。你有什么建议可以让它工作吗?或者我不应该在可能为 NULL 的列上匹配?
-
处理这种情况的一种方法是将这些空值转换为实际值:
coalesce(TDT.DataValue, '!@#$%') = coalesce(TDT.DataValue, '!@#$%') -
成功了!如果您想将其作为解决方案,我会将其标记为答案。
-
@webdad3 谢谢。很高兴你让它工作了。
标签: sql sql-server