为什么在SQLite中使用NOT EXISTS进行筛选时需要相等条件



我有一个产品目录和这些产品的客户订单列表。我想找到还没有订单的产品,并在SQLite:中尝试过

SELECT  product_id
FROM    products p
WHERE   NOT EXISTS    (SELECT product_id FROM orders ord)

然而,这只是在没有任何过滤的情况下生成产品p的整个列表。为什么下面的解决方案有效,而上面的解决方案无效?

SELECT  product_id
FROM    products p
WHERE   NOT EXISTS    (SELECT product_id FROM orders ord
WHERE p.product_id = ord.product_id)

;等于";条件使子查询成为相关的子查询。如果没有它,NOT EXISTS就可以正常工作。它运行子查询,如果子查询返回任何行,那么所有内容都会被过滤掉。

假定orders至少有一行,因此子查询总是返回一行(没有EXISTS(。因此,整个查询返回空集。

通过关联子句,每个product_id都是独立检查的。因此,查询返回从未订购过的产品。

最新更新