如何通过 SQL 中的另一个 table 找到一个 table 中不存在的值

How to find a value that doesn't exist in one table through another table in SQL

出版商Table

图书Table

这些是我的 SQL 查询中的 2 个表,我想找出尚未出版任何书籍的出版商

我使用 SQL 服务器并且我使用了:

SELECT PublisherID 
FROM Publisher 
WHERE PublisherID NOT IN (SELECT PublisherID FROM Book); 

但它不起作用。我做错了什么吗?

这是该查询的结果 结果Table

您必须在子查询中使用条件 PublisherID IS NOT NULL。您的 NULL 记录返回所有行的 false

SELECT PublisherID 
FROM Publisher 
WHERE PublisherID NOT IN (SELECT PublisherID FROM Book WHERE PublisherID IS NOT NULL); 

或者您可以使用 LEFT JOIN 并使用 WHERE b.PublisherID IS NULL 添加条件。

SELECT *
FROM Publisher p
    LEFT JOIN Book b
        ON b.PublisherID = p.PublisherID
WHERE b.PublisherID IS NULL

要找出出版了超过 1 本书的出版商,您可以使用 GROUP BY & HAVINGIN,如下所示。

SELECT PublisherID 
FROM @Publisher 
WHERE PublisherID IN (
    SELECT PublisherID
    FROM @Book 
    WHERE PublisherID IS NOT NULL
    GROUP BY PublisherID
    HAVING COUNT(PublisherID) > 1
);

NOT IN can return incorrect results 当涉及 NULL 值时。而是使用 NOT EXISTS

SELECT p.PublisherID 
FROM Publisher p
WHERE NOT EXISTS (SELECT 1
    FROM Book b
    WHERE b.PublisherID = p.PublisherID
);