1

我对这两个查询的结果感到惊讶。我对两者的期望相同。我有两个共享一个公共字段的表,但没有建立关系。table( A) 有一个字段EventID varchar(10),table( B) 有一个字段XXNumber varchar(15)

表列中的值在表BXXNumber中引用。尽管可以容纳 15 个字符,但 179K 行数据中没有一个长度超过 10 个字符。AEventIDXXNumber

所以要求是:

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

要查看我有多少常见记录,我首先运行了这个查询 - 称之为查询 alpha"

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

结果是 5322 行。

以下查询 - 称之为查询增量,如下所示:

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

已返回 4308 行。

结果的行数不应该相同吗?

4

1 回答 1

6

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

每次成功连接时,INNER JOIN版本都会从父表中选择每一行,因此如果子表中有 3 行具有该值,而父表中有 2 行,则该值的结果中将有 6 行。

要使它们“相同”,请将“DISTINCT”添加到您的主选择中。

为了解释您所看到的,我们需要更多地了解您的实际数据。

于 2013-02-04T23:57:45.913 回答