我有以下架构:
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表中甚至只有一行,则查询将起作用。
有人可以解释一下我在这里缺少什么和/或为什么会这样?
答案 0 :(得分:1)
这里有问题的一行是
WHERE product.id NOT IN (
SELECT id_product FROM client_has_produc WHERE id_client)
因为
时总会返回falseWHERE product.id NOT IN ( null )
此外,没有交集的表的并集将返回所有行的配对。
FROM product,client
即使有2个或更多客户拥有相同的产品,也会产生一个产品。
GROUP BY product.id
解决方案是在所有表上执行join
,然后过滤掉特定的客户端。
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
答案 1 :(得分: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;
希望有所帮助!