我需要哪种类型的加入?

时间:2011-10-14 13:45:36

标签: mysql sql join

我有2张桌子,合约和推销员。 最近我发现数据中有一些错误,有些合同在'推销员'中找不到salesid,我怀疑是意外删除或某种输入错误。

我应该使用哪个联接来查找所有不属于销售人员的合同,换句话说,在salesmen.id列中找不到contract.salesid。

它应该是一个正确的外连接,但结果不是正确的。

6 个答案:

答案 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); contractssalesid不匹配的所有内容。在大型表上使用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)