Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/73.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 如何在多对多关系(包括null)中使用NOT IN进行查询_Sql_Postgresql - Fatal编程技术网

Sql 如何在多对多关系(包括null)中使用NOT IN进行查询

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 ----

如果我有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。

使用联接进行查询:

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'
                 );