首页 > 解决方案 > 如何在包括 NULL 在内的多对多关系中使用 NOT IN 进行查询

问题描述

鉴于我有 3 个表,我需要检索与特定记录没有关系的所有行,并包括零关系的行,我该如何构建这个查询?

SELECT id, name FROM books;
 id | name    
---------------------------
 B1 | the book
 B2 | super book
 B3 | another great book
 B4 | how to be a book

SELECT id, name FROM authors;
 id | name         
---------------------------
 A1 | Huey
 A2 | Dewey
 A3 | Louie
 A4 | Donald

SELECT "bookId", "authorId" FROM books_authors;
 bookId | authorId           
---------------------------+---------------------------
 B1 | A1
 B3 | A2
 B4 | A2
 B4 | A4

-- Book B2 has no author
-- Book B4 has 2 authors

我需要所有作者杜威(id = A2)根本没有关系的书。

因为 B4 与作者杜威 (A2) 有关系,所以不应返回。

查询应该只返回 B1 和 B2。

标签: sqlpostgresql

解决方案


SELECT * FROM books 
WHERE id NOT IN
(SELECT bookid FROM books_authors WHERE authorid = 'A2')

推荐阅读