首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我内心的加入太多了

我内心的加入太多了
EN

Stack Overflow用户
提问于 2016-07-15 18:30:59
回答 5查看 69关注 0票数 1

我的内部连接过滤太多了,否则我看不出有什么区别。

我试图在同一台服务器上合并来自两个不同数据库的两个表。

我的第一步是找到所有匹配的值:

代码语言:javascript
复制
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+记录插入临时表之后运行此查询:

代码语言:javascript
复制
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)的记录都是完全相同的!

代码语言:javascript
复制
 DataID: 1
 AnotherID: 1
 DataValue: NULL
 TextValue: NORMAL
 DefaultValue: 0
 RateValue: NULL
 YetAnotherID: 1

我想我的内部连接在结构上发现了这两个表之间的差异,但我看不见。

对是什么原因有什么想法吗?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2016-07-15 18:39:32

这很可能是由于表中的NULL值未能通过LEFT JOIN的等式检查造成的。

NULL值不等于任何东西,甚至不等于同一数据类型的另一个NULL

为了纠正这种情况,除了现有的ON条件之外,还可以为双方的NULL值添加一个检查:

代码语言:javascript
复制
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
票数 2
EN

Stack Overflow用户

发布于 2016-07-15 18:42:10

我喜欢这种处理NULL等式比较的方法。

这里有更多的细节

代码语言:javascript
复制
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) 
票数 2
EN

Stack Overflow用户

发布于 2016-07-15 20:36:14

代码语言:javascript
复制
  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)
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38402948

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档