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

时间:2016-06-30 22:36:06

标签: mysql

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

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

SELECT * FROM table1 
WHERE id NOT IN (SELECT id FROM table2)

id虽然是由两列id1id2组成的合成主键。 任何想法如何处理?

编辑:考虑到NOT IN的危险我会尝试更好地描述我的需求。 除了选择不在secondtable中的条目之外,还需要在同一查询中执行另外两项操作:

  • 选择小于5的列,我认为可以使用AND t1.column <5
  • 轻松完成
  • 内部联接table1id1上有第三个表格,因为我需要该表格中的列。

2 个答案:

答案 0 :(得分:3)

not in似乎会让事情过于复杂 - 而且,根据Drew的评论,如果括号内的任何内容都可以null,则可能非常危险和/或真气。

这似乎是outer join的教科书使用。在关键字列上使用left [outer] join,如果他们(或右侧表格中的任何其他非null能力列)在null之后被发现连接,这意味着在右侧表中没有该复合键的匹配记录。

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

答案 1 :(得分:2)

您可以将行构造函数与NOT IN一起使用:

SELECT *
FROM table1 
WHERE (id1, id2) NOT IN (SELECT id1, id2 FROM table2);