不存在与。左外连接
NOT EXISTS Vs. Left Outer Join
我对通过 NOT EXISTS
与 LEFT OUTER JOIN
和 NULL 获得的结果感到困惑。
考虑以下两个产生截然不同结果的查询。请注意 fkMasterPersonID
不是右边的外键 table (tblInternetMasterPerson
)
查询 1
SELECT tl.pkLeadID, tl.fkMasterPersonID
FROM dbo.tblPhoneLead tl
WHERE NOT EXISTS (
SELECT MasterPersonID
FROM dbo.tblInternetMasterPerson
)
以上returns无结果
查询 2
SELECT tl.pkLeadID, tl.fkMasterPersonID
FROM dbo.tblPhoneLead tl
LEFT JOIN dbo.tblInternetMasterPerson mp
ON tl.fkMasterPersonID = mp.MasterPersonID
WHERE tl.fkMasterPersonID IS null
以上returns237条记录fkMasterPersonID
全部为NULL
通过 NOT EXISTS
确定 fkMasterPersonID
是否不存在于 dbo.tblInternetMasterPerson
上的正确方法是什么?这个 table 确实有列 pkMasterPersonID
但它是自动递增的并且不是任何其他 table.
的外键
您需要将存在的子查询关联到外部查询。这是一种方法:
SELECT tl.pkLeadID, tl.fkMasterPersonID
FROM dbo.tblPhoneLead tl
WHERE NOT EXISTS (
SELECT 1
FROM dbo.tblInternetMasterPerson mp
WHERE mp.MasterPersonID = tl.fkMasterPersonID
);
我对通过 NOT EXISTS
与 LEFT OUTER JOIN
和 NULL 获得的结果感到困惑。
考虑以下两个产生截然不同结果的查询。请注意 fkMasterPersonID
不是右边的外键 table (tblInternetMasterPerson
)
查询 1
SELECT tl.pkLeadID, tl.fkMasterPersonID
FROM dbo.tblPhoneLead tl
WHERE NOT EXISTS (
SELECT MasterPersonID
FROM dbo.tblInternetMasterPerson
)
以上returns无结果
查询 2
SELECT tl.pkLeadID, tl.fkMasterPersonID
FROM dbo.tblPhoneLead tl
LEFT JOIN dbo.tblInternetMasterPerson mp
ON tl.fkMasterPersonID = mp.MasterPersonID
WHERE tl.fkMasterPersonID IS null
以上returns237条记录fkMasterPersonID
全部为NULL
通过 NOT EXISTS
确定 fkMasterPersonID
是否不存在于 dbo.tblInternetMasterPerson
上的正确方法是什么?这个 table 确实有列 pkMasterPersonID
但它是自动递增的并且不是任何其他 table.
您需要将存在的子查询关联到外部查询。这是一种方法:
SELECT tl.pkLeadID, tl.fkMasterPersonID
FROM dbo.tblPhoneLead tl
WHERE NOT EXISTS (
SELECT 1
FROM dbo.tblInternetMasterPerson mp
WHERE mp.MasterPersonID = tl.fkMasterPersonID
);