我正在使用northwind数据库并尝试查找从未订购的产品对。
我可以通过简单的
轻松获得所有可能的产品对select p1.ProductName, p2.ProductName
FROM products p1 CROSS JOIN products p2
它整齐地返回所有可能的组合(准确地说是5'929)。
要从订单详细信息中获取所有产品对,我需要加入几个表,但是
select DISTINCT p3.ProductName, p4.ProductName
FROM order_details od1
JOIN products p3
ON od1.ProductID = p3.ProductID
CROSS JOIN order_details od2
ON od1.OrderId = od2.OrderID
JOIN products p4
ON od2.ProductId = p4.productid
技巧并返回3'147组合。
问题是当我尝试从第一个中减去第二个查询结果时。无论我使用join
还是where
,我总能得到大约1800万条记录。我做错了什么?
答案 0 :(得分:0)
这应该是你的事后
编辑:这仅适用于MySQL。没有看到OP在评论中提到Northwind。
SELECT p1.ProductName, p2.ProductName
FROM products p1
CROSS JOIN products p2
WHERE (p1.ProductName, p2.ProductName) NOT IN (
SELECT DISTINCT p3.ProductName, p4.ProductName
FROM order_details od1
JOIN products p3
ON od1.ProductID = p3.ProductID
CROSS JOIN order_details od2
ON od1.OrderId = od2.OrderID
JOIN products p4
ON od2.ProductId = p4.productid
)
应该返回2,782个结果