所以我有两个表,它们都有一个由两列组成的复合主键。我想在第一个表中找到第二个表中不存在的条目,始终记住我的主键是合成的。
我知道我必须使用NOT IN
,但我不确定如何使用两个主键。基本上我想要这样的东西:
SELECT * FROM table1
WHERE id NOT IN (SELECT id FROM table2)
id
虽然是由两列id1
和id2
组成的合成主键。
任何想法如何处理?
编辑:考虑到NOT IN
的危险我会尝试更好地描述我的需求。
除了选择不在secondtable中的条目之外,还需要在同一查询中执行另外两项操作:
AND t1.column <5
table1
在id1
上有第三个表格,因为我需要该表格中的列。答案 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);