1

我有以下架构:

product: id , title
client: id, name
client_has_product:id, id_product, id_client, date.

我想获取不属于某个客户的所有产品的列表。

我正在运行以下查询:

SELECT DISTINCT product.id, product.title, client.id
FROM product,client
WHERE product.id NOT IN (
SELECT id_product FROM client_has_product WHERE id_client = 1)
GROUP BY product.id

问题是,如果 client_has_product 表为空,则查询不会返回任何内容,但如果 client_has_product 表中甚至只有一行,则查询有效。

有人可以解释一下我在这里缺少什么和/或为什么会这样吗?

4

2 回答 2

1

这里有问题的行是

WHERE product.id NOT IN (
SELECT id_product FROM client_has_produc WHERE id_client)

因为这将始终返回 false 时

WHERE product.id NOT IN ( null )

此外,这个没有交集的表联合将返回所有行的配对。

FROM product,client

即使有 2 个或更多客户拥有相同的产品,这也将始终生产一种产品。

GROUP BY product.id

解决方案是join对所有表执行 a,然后过滤掉特定的客户端。

SELECT DISTINCT product.id, product.title, client.id
FROM product
LEFT JOIN client_has_produc ON product.id = client_has_produc.id_product
LEFT JOIN client ON client.id = client_has_produc.id_client
WHERE client_has_product.id_client <> 1
于 2012-10-17T11:34:40.367 回答
1

您应该替换 NOT IN WITH JOIN,以下是一个示例:

/ NOT IN 查询/

USE AdventureWorks;
GO
SELECT ProductID
FROM Production.Product
WHERE ProductID
NOT IN (
SELECT ProductID
FROM Production.WorkOrder);

/加入查询/:-

SELECT p.ProductID
FROM Production.Product p
LEFT JOIN Production.WorkOrder w ON p.ProductID = w.ProductID
WHERE w.ProductID IS NULL;

希望有帮助!

于 2012-10-17T11:34:48.470 回答