ANSI SQL中的EXISTS。超级查询中的表名

时间:2017-09-10 00:37:43

标签: sql language-lawyer exists ansi-sql

这是一个经典的EXISTS查询:

SELECT S.SupplierName AS Supplier
FROM Suppliers S
WHERE EXISTS (SELECT P.ProductName FROM Products P WHERE P.SupplierId = S.supplierId AND P.Price < 20);

但是,我被告知虽然这个查询几乎可以在每个数据库引擎中使用,但在ANSI SQL中不允许这样做,因为我在子查询中命名了一个未在主查询中明确命名的表。 / p>

这样的事情应该是正确的:

SELECT S.SupplierName AS Supplier
FROM Suppliers S, Products P --Yes, join is pending here
WHERE EXISTS (SELECT P2.ProductName FROM Products P2 WHERE P2.SupplierId = S.supplierId AND P2.Price < 20);

但这对我来说也没有意义,但是我搜索了一个官方的ANSI SQL示例来证明没有必要在主查询中命名子查询的表,而我没有找到任何东西。

如果有人能告诉我第一个查询是否是ANSI SQL,我真的很感激。

1 个答案:

答案 0 :(得分:1)

此查询:

SELECT S.SupplierName AS Supplier
FROM Suppliers S
WHERE EXISTS (SELECT P.ProductName
              FROM Products P
              WHERE P.SupplierId = S.supplierId AND P.Price < 20
             );

是有效的ANSI SQL。它在我知道的每个(合理的)数据库中都有效。我应该补充一点,我会在子查询中使用SELECT 1 - 但是从语法的角度来看,选择的列并不重要。

无论你在哪里学到这一点:

  

在ANSI SQL中不允许这样做,因为我在其中命名了一个表   未在主查询中明确命名的子查询。

不正确。

我应该注意,尽管ANSI SQL中允许使用逗号,但不建议使用它。您应始终使用明确的JOIN语法,在本例中为CROSS JOIN