我有2张桌子,合约和推销员。 最近我发现数据中有一些错误,有些合同在'推销员'中找不到salesid,我怀疑是意外删除或某种输入错误。
我应该使用哪个联接来查找所有不属于销售人员的合同,换句话说,在salesmen.id列中找不到contract.salesid。
它应该是一个正确的外连接,但结果不是正确的。
答案 0 :(得分:4)
听起来你正在寻找一个“反加入”。 Explain Extended讨论了在MySQL中执行此操作的三种方法:
WHERE __ IS NULL
NOT IN
子句。NOT EXISTS
子句。答案 1 :(得分:3)
如果您在[{1}}中找不到contract.salesid
,则可以使用salesmen.id
而不是加入。
NOT IN()
上述内容将返回SELECT * FROM contracts WHERE salesid NOT IN (SELECT id FROM salesmen);
contracts
与salesid
不匹配的所有内容。在大型表上使用salesmen.id
可能比使用NOT IN ()
更慢,但如果您的表不是太大,通常使用的方法更为简单(在我看来)。
答案 2 :(得分:0)
left outer join
如果您要从合同加入推销员
编辑:以错误的方式订购
答案 3 :(得分:0)
SELECT c.contract_id FROM contract c
LEFT OUTER JOIN salesmen s ON s.salesman_id = c.salesman_id
WHERE c.salesman_id IS NULL
是我的猜测。
答案 4 :(得分:0)
外连接确实可以做到,但为什么不简单:
select *
from contract c
where c.salesid not in (select s.id
from salesmen s)
答案 5 :(得分:0)
我想这就是答案:
select * from Contract c
right outer join Salesmen s on (c.salesid = s.id)