SQL:选择另一个表中没有复合主键的条目

use*_*582 3 mysql

所以我有两个表,它们都有一个由两列组成的复合主键。我想找到第一个表中第二个表中不存在的条目,始终记住我的主键是复合的。

我知道我必须使用NOT IN,但我不确定如何使其与两个主键一起使用。本质上我想要这样的东西:

SELECT * FROM table1 
WHERE id NOT IN (SELECT id FROM table2)
Run Code Online (Sandbox Code Playgroud)

虽然id是由两列组成的复合主键,id1id2。有什么想法如何解决这个问题吗?

编辑:考虑到危险,NOT IN我会尽力更好地描述我需要什么。除了选择不在第二个表中的条目之外,还需要在同一查询中执行两个操作:

  • 选择小于 5 的列,我认为可以通过使用轻松完成AND t1.column <5
  • table1与第三个表进行内部联接id1,因为我需要该表中的一列。

und*_*e_d 5

not in看起来这会让事情变得过于复杂——而且,根据德鲁的评论,如果括号内的任何内容可能是,则可能非常危险和/或令人恼火null

这看起来像是教科书上使用的outer join。在键的列上使用 a ,如果发现它们(或右侧表中的left [outer] join任何其他单个不可列)位于连接之后,则意味着右侧表中没有具有该组合键的匹配记录。nullnull

select *
from
    t1
    inner join t3 on
        t1.whatever = t3.whatever
    left join t2 on
        t1.id1 = t2.id1 and
        t1.id2 = t2.id2
where
    t1.some_column < 5 and -- 'normal' where criteria
    t2.id1 is null;         -- no match for key in t2
Run Code Online (Sandbox Code Playgroud)

  • 如果人们到处使用“not in”而不提及[危险](http://stackoverflow.com/a/32175659)(毕竟,这里的人都是新手),那么哎呀。后来,由于它是他们方便的工具箱的一部分,他们花费了无数的时间来调试他们的代码,或者甚至不知道存在问题。 (2认同)