SQL INNER JOIN与WHERE ID IN(...)结果不一样

时间:2013-02-04 23:30:59

标签: sql

我对这两个查询的结果感到惊讶。我期待两者都一样。我有两个共享一个共同字段的表,但没有设置关系。表格(A)包含字段EventID varchar(10),表格(B)包含字段XXNumber varchar(15)

BXXNumber中引用了表AEventID中的值。即使XXNumber可以容纳15个字符,179K行数据也不会超过10个字符。

所以要求是:

  

“为避免重复表格B和表格A条目,如果表格A>”事件ID“中包含XXNumber,则不应计算它。”

要查看我有多少常见记录,我先运行此查询 - 称之为查询字母“

SELECT dbo.TableB.XXNumber FROM dbo.TableB WHERE dbo.TableB.XXNumber in
  ( select distinct dbo.TableA.EventId FROM dbo.TableA )

结果是5322行。

以下查询 - 将其称为查询delta,如下所示:

SELECT DISTINCT dbo.TableB.XXNumber, dbo.TableB.EventId
FROM dbo.TableB INNER JOIN dbo.TableA ON dbo.TableB.XXNumber= dbo.TableB.EventId

haas返回了4308行。

结果行数不应该相同吗?

1 个答案:

答案 0 :(得分:6)

WHERE ID IN ()版本将选择与列表中每个 distinct 值匹配的所有行(无论您是否在内部选择内部编码DISTINCT - 这都是无关紧要的) 。如果给定值多次出现在父表中,您将从父表中为子表中找到的单个值选择多重行。

INNER JOIN版本将为每个成功的连接选择一次父表中的每一行,因此如果子表中有3行包含值,而在父表中有2行,那么将有6行该值的结果中的行。

要使它们“相同”,请在主要选择中添加“DISTINCT”。

为了解释您所看到的内容,我们需要了解您的实际数据。