我正在使用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万条记录。我做错什么了? 最佳答案
这应该是你想要的
编辑:这只适用于MySQL。没有看到OP在评论中提到北风。
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
)
应该会返回2782个结果
关于mysql - SQL连接和结果过滤,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20364763/