这是一个经典的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,我真的很感激。
答案 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
。