通过with语句检查先前检索的关系中值的出现

时间:2018-06-14 13:38:29

标签: sql

在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查询的列表?

我不是在寻找使用完全不同方法的等效查询。我想通过更改代码的最后一行来了解是否有某种方法可以实现这一点。

1 个答案:

答案 0 :(得分:2)

一个选项使用子查询:

WHERE Supplypart.partid NOT IN (SELECT partid FROM sp2supplies);

我们也可以使用EXISTS子句编写您的要求,但WHERE INEXISTS通常会针对相同的内容进行优化。

以下是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);