我的内部连接过滤太多了,否则我看不出有什么区别。
我试图在同一台服务器上合并来自两个不同数据库的两个表。
我的第一步是找到所有匹配的值:
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+行)。
我看了一张唱片,看看是否能识别出一些古怪的东西,我发现每个表(INTL和US)的记录都是完全相同的!
DataID: 1
AnotherID: 1
DataValue: NULL
TextValue: NORMAL
DefaultValue: 0
RateValue: NULL
YetAnotherID: 1我想我的内部连接在结构上发现了这两个表之间的差异,但我看不见。
对是什么原因有什么想法吗?
发布于 2016-07-15 18:39:32
这很可能是由于表中的NULL值未能通过LEFT JOIN的等式检查造成的。
NULL值不等于任何东西,甚至不等于同一数据类型的另一个NULL。
为了纠正这种情况,除了现有的ON条件之外,还可以为双方的NULL值添加一个检查:
SELECT intl.DataID
FROM tblData intl
LEFT JOIN TempDataTable TDT
ON (
(TDT.DataID IS NULL AND intl.DataID IS NULL)
OR TDT.DataId = intl.DataId
)
AND (
(TDT.AnotherID IS NULL AND intl.AnotherID IS NULL)
OR TDT.AnotherId = intl.AnotherId
)
AND (
(TDT.DataValue IS NULL AND intl.DataValue IS NULL)
OR TDT.DataValue = intl.DataValue
)
AND (
(TDT.TextValue IS NULL AND intl.TextValue IS NULL)
OR TDT.TextValue = intl.TextValue
)
AND (
(TDT.DefaultValue IS NULL AND intl.DefaultValue IS NULL)
OR TDT.DefaultValue = intl.DefaultValue
)
AND (
(TDT.RateValue IS NULL AND intl.RateValue IS NULL)
OR TDT.RateValue = intl.RateValue
)
AND (
(TDT.YetAnotherID IS NULL AND intl.YetAnotherID IS NULL)
OR TDT.YetAnotherID = intl.YetAnotherID
)
WHERE TDT.DataID IS NULL发布于 2016-07-15 18:42:10
我喜欢这种处理NULL等式比较的方法。
这里有更多的细节
SELECT intl.*
FROM tblData intl
INNER JOIN [db].dbo.tblData us
ON EXISTS (SELECT intl.DataID,
intl.AnotherID,
intl.DataValue,
intl.TextValue,
intl.DefaultValue,
intl.RateValue,
intl.YetAnotherID,
INTERSECT
SELECT us.DataID,
us.AnotherID,
us.DataValue,
us.TextValue,
us.DefaultValue,
us.RateValue,
us.YetAnotherID) 发布于 2016-07-15 20:36:14
Values null not take in your query. Use isnull(value, 0) for type value number and isnull(value, '') for type value chararctere
SELECT intl.DataID
FROM tblData intl
inner JOIN TempDataTable TDT
ON isnull(TDT.DataID, 0) = isnull(intl.DataID, 0)
AND isnull(TDT.AnotherID, 0) = isnull(intl.AnotherID, 0)
AND isnull(TDT.DataValue, '') = isnull(intl.DataValue, '')
AND isnull(TDT.TextValue, '') = isnull(intl.TextValue, '')
AND isnull(TDT.DefaultValue, 0) = isnull(intl.DefaultValue, 0)
AND isnull(TDT.RateValue, '') = isnull(intl.RateValue, '')
AND isnull(TDT.YetAnotherID, 0) = isnull(intl.YetAnotherID, 0)https://stackoverflow.com/questions/38402948
复制相似问题