我正在使用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个组合。
问题是当我试图从第一个查询结果中减去第二个查询结果时。无论我使用什么joinwhere,我总是得到大约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/

10-11 03:27
查看更多