我对这两个查询的结果感到惊讶。我期待两者都一样。我有两个共享一个共同字段的表,但没有设置关系。表格(A
)包含字段EventID varchar(10)
,表格(B
)包含字段XXNumber varchar(15)
。
表B
列XXNumber
中引用了表A
列EventID
中的值。即使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行。
结果行数不应该相同吗?
答案 0 :(得分:6)
WHERE ID IN ()
版本将选择与列表中每个 distinct 值匹配的所有行(无论您是否在内部选择内部编码DISTINCT
- 这都是无关紧要的) 。如果给定值多次出现在父表中,您将从父表中为子表中找到的单个值选择多重行。
INNER JOIN
版本将为每个成功的连接选择一次父表中的每一行,因此如果子表中有3行包含值,而在父表中有2行,那么将有6行该值的结果中的行。
要使它们“相同”,请在主要选择中添加“DISTINCT”。
为了解释您所看到的内容,我们需要了解您的实际数据。