使用" LEFT OUTER JOIN获得不同的结果"和" IN",我的逻辑在哪里出错了?

时间:2014-03-22 17:38:57

标签: tsql join

我有四个表,一个是主发票表,另外三个是来自不同地区的发票。我想要实现的是仅返回主发票表中的记录,其中发票编号位于其他三个表中的一个表中。例如:

 SELECT * FROM Invoice_Master M
 LEFT OUTER JOIN Invoice_North N
   ON M.InvNo = N.InvNo
 LEFT OUTER JOIN Invoice_East E
   ON M.InvNo = E.InvNo
 LEFT OUTER Invoice_South S
   ON M.InvNo = S.InvNo
 WHERE N.InvNo IS NOT NULL
   OR E.InvNo IS NOT NULL
   OR S.InvNo IS NOT NULL

逻辑是如果我" LEFT OUTER JOIN" 3表到Master表,如果任何InvNo不为null,则发票必须存在于原始Master表中。

然而,当我在这个隐式连接中编写代码时,我得到的回报略少一些:

 select * FROM Invoice_Master
 WHERE InvNo IN (
   SELECT InvNo FROM Invoice_North)
 OR InvNo IN (
   SELECT InvNo FROM Invoice_East)
 OR InvNo IN (
   SELECT InvNo FROM Invoice_South)

我的逻辑在哪里出错?

1 个答案:

答案 0 :(得分:1)

差异可能是由于第二个查询从主表中选择了离散行,而您的第一个查询可能是在返回具有重复行的连接结果。即如果左外连接匹配两行,例如invoice_north,则这两行将显示在主select中。