SQL Join和结果过滤

时间:2013-12-04 00:52:54

标签: mysql sql

我正在使用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万条记录。我做错了什么?

1 个答案:

答案 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个结果