postgresql Postgress如何使用not in查询多个列

bxjv4tth  于 2022-12-18  发布在  PostgreSQL
关注(0)|答案(2)|浏览(140)

我想从表C中选择A列“item_a_id”和B列“item_b_id”不在另一个查询结果中的所有项目ID。
目前我使用这个查询两次,我没有找到一种方法,如何查询它,而不使用相同的查询两次。
这是我的疑问:

SELECT * from table_c c
WHERE c.item_a_id NOT IN 
(
 SELECT a.item_id,b.item_id 
 FROM table_a a 
 JOIN table_b b on a.item_id = b.item_id
) 
AND c.item_b_id NOT IN 
(
 SELECT a.item_id,b.item_id 
 FROM table_a a 
 JOIN table_b b on a.item_id = b.item_id
)

而这就是我想要改进它的方式(ofc这不是sql语法,只是一个例子)

SELECT * from table_c c
WHERE c.item_a_id AND c.item_b_id NOT IN 
(
 SELECT a.item_id,b.item_id 
 FROM table_a a 
 JOIN table_b b on a.item_id = b.item_id
)
6jygbczu

6jygbczu1#

您需要将左手的列括在括号中:

WHERE (c.item_a_id, c.item_b_id) 
      NOT IN (SELECT a.item_id,b.item_id 
              FROM table_a a 
               JOIN table_b b on a.item_id = b.item_id)

但通常NOT EXISTS条件比NOT IN条件更快

WHERE NOT EXISTS (SELECT *
                  FROM table_a a 
                    JOIN table_b b on a.item_id = b.item_id
                  WHERE a.item_id = c.item_a_id 
                    AND b.item_id = c.item_b_id)
uxhixvfz

uxhixvfz2#

如果我理解正确的话,您应该能够对A表和B表执行两个连续的左连接,那么有效的匹配就是两个表都没有任何连接匹配的匹配。

SELECT *
FROM table_c c
LEFT JOIN table_a a
    ON c.item_a_id = a.item_id
LEFT JOIN table_b b
    ON c.item_b_id = b.item_id
WHERE
    a.item_id IS NULL AND
    b.item_id IS NULL;

顺便说一下,上面的查询专门称为左反连接。

相关问题