在SQL中是否有办法检查值是否出现在以前由with语句检索的关系中?
WITH sp2supplies AS
(
--- This gives me all the parts that supplier 2 supplies
SELECT Supplypart.partid
FROM Supplier
JOIN Supplypart USING(supplierid)
WHERE Supplier.suppliername = 'Supplier#000000002'
)
--- Now I'm retrieving all the parts that supplier 1 supplies and supplier 2 doesn't
SELECT COUNT(*)
FROM Supplier
JOIN Supplypart USING(supplierid)
WHERE Supplier.suppliername = 'Supplier#000000001'
--- Question: Is there any way to use the previously retrieved list of products
--- that supplier 2 supplies in order to exclude them?
--- Ideally, I'd just change this line here.
AND Supplypart.partid NOT IN sp2supplies.partid;
是否有某种方法可以将列sp2supplies.partid
转换为适用于IN
查询的列表?
我不是在寻找使用完全不同方法的等效查询。我想通过更改代码的最后一行来了解是否有某种方法可以实现这一点。
答案 0 :(得分:2)
一个选项使用子查询:
WHERE Supplypart.partid NOT IN (SELECT partid FROM sp2supplies);
我们也可以使用EXISTS
子句编写您的要求,但WHERE IN
和EXISTS
通常会针对相同的内容进行优化。
以下是EXISTS
版本的外观:
SELECT COUNT(*)
FROM Supplier s1
INNER JOIN Supplypart sp1 USING(supplierid)
WHERE
s1.suppliername = 'Supplier#000000001' AND
NOT EXISTS (SELECT 1 FROM Supplier s2 INNER JOIN Supplypart sp2 USING(supplierid)
WHERE s2.suppliername = 'Supplier#000000002' AND
sp1.partid = sp2.partid);