Sql 通过with语句检查以前检索到的关系中的值是否出现

Sql 通过with语句检查以前检索到的关系中的值是否出现,sql,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 = '

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
转换为一个列表,该列表可以与
查询中的
一起使用


我不是在寻找一个使用完全不同方法的等价查询。我想知道是否有办法通过更改代码的最后一行来实现这一点。

一个选项使用子查询:

WHERE Supplypart.partid NOT IN (SELECT partid FROM sp2supplies);
我们也可以使用
EXISTS
子句编写您的需求,但是
WHERE IN
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);

一个选项使用子查询:

WHERE Supplypart.partid NOT IN (SELECT partid FROM sp2supplies);
我们也可以使用
EXISTS
子句编写您的需求,但是
WHERE IN
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);

我理解你的提议。这意味着我将在WITH语句中对该子查询进行查询。但是,我想知道是否有一种方法可以将WITH查询的结果转换为一个列表,我可以使用该列表检查最后一行的(非)成员身份。这是最接近您字面上的建议。啊,您是对的!现在我明白了!我没有执行整个查询,但我只是再次选择WITH查询的结果。我希望点符号能让我做到这一点,但似乎这就是它必须被指定的方式。谢谢我理解你的提议。这意味着我将在WITH语句中对该子查询进行查询。但是,我想知道是否有一种方法可以将WITH查询的结果转换为一个列表,我可以使用该列表检查最后一行的(非)成员身份。这是最接近您字面上的建议。啊,您是对的!现在我明白了!我没有执行整个查询,但我只是再次选择WITH查询的结果。我希望点符号能让我做到这一点,但似乎这就是它必须被指定的方式。谢谢你用哪一种?“SQL”只是一种查询语言,而不是特定数据库产品的名称。请为您正在使用的数据库产品
postgresql
oracle
sql server
db2
,…有更简单的方法来获得您想要的结果。您使用哪种方法?“SQL”只是一种查询语言,而不是特定数据库产品的名称。请为您正在使用的数据库产品添加一个“
postgresql
oracle
sqlserver
db2
,”有更简单的方法来获得您想要的结果。