我有四个表,一个是主发票表,另外三个是来自不同地区的发票。我想要实现的是仅返回主发票表中的记录,其中发票编号位于其他三个表中的一个表中。例如:
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)
我的逻辑在哪里出错?
答案 0 :(得分:1)
差异可能是由于第二个查询从主表中选择了离散行,而您的第一个查询可能是在返回具有重复行的连接结果。即如果左外连接匹配两行,例如invoice_north
,则这两行将显示在主select
中。