Sql 通过with语句检查以前检索到的关系中的值是否出现
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 = '
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
,”有更简单的方法来获得您想要的结果。