我有一个产品目录和这些产品的客户订单列表。我想找到还没有订单的产品,并在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
都是独立检查的。因此,查询返回从未订购过的产品。