Sql 如何在多对多关系(包括null)中使用NOT IN进行查询
如果我有3个表,并且我需要检索与特定记录没有关系的所有行,并包括没有关系的行,那么我如何构建此查询 从书本中选择id、名称; id |名称 -------------- B1 |这本书 B2 |超级图书 B3 |另一本好书 B4 |如何成为一本书 从作者中选择id、名称; id |名称 -------------- A1 |休伊 A2 |杜威 A3 |路易 A4 |唐纳德 选择bookId,authorId FROM books\u authors; bookId | authorId --------------+-------------- B1 | A1 B3 | A2 B4 | A2 B4 | A4 -这本书没有作者 -书B4有两位作者 我需要所有作者杜威id=A2完全没有关系的书 因为B4与作者杜威A2有关系,所以不应该返回 查询应仅返回B1和B2。使用联接进行查询:Sql 如何在多对多关系(包括null)中使用NOT IN进行查询,sql,postgresql,Sql,Postgresql,如果我有3个表,并且我需要检索与特定记录没有关系的所有行,并包括没有关系的行,那么我如何构建此查询 从书本中选择id、名称; id |名称 -------------- B1 |这本书 B2 |超级图书 B3 |另一本好书 B4 |如何成为一本书 从作者中选择id、名称; id |名称 -------------- A1 |休伊 A2 |杜威 A3 |路易 A4 |唐纳德 选择bookId,authorId FROM books\u authors; bookId | authorId ----
SELECT * FROM books
WHERE id NOT IN
(SELECT bookid FROM books_authors WHERE authorid = 'A2')
SELECT DISTINCT books.*
FROM books
LEFT JOIN books_authors ON books_authors.bookId = books.id AND authorId <> 'A2'
WHERE authorId IS NOT NULL;
我建议不存在:
这假设您希望查询按姓名而不是id引用作者。Use not EXISTS,这里有很多示例。或者您可以将作者加入books\u authors,并过滤符合bookId为NULL条件的行
SELECT DISTINCT books.*
FROM books
LEFT JOIN books_authors ON books_authors.bookId = books.id AND authorId <> 'A2'
WHERE authorId IS NOT NULL;
+====+==================+
| id | name |
+====+==================+
| B4 | how to be a book |
+----+------------------+
| B1 | the book |
+----+------------------+
select b.*
from books b
where not exists (select 1
from book_authors ba join
authors a
on ba.authorid = a.id
where ba.bookid = b.id and
a.name = 'Dewey'
);