我偶然发现了这个例子:
SELECT SupplierName
FROM Suppliers
WHERE EXISTS (SELECT ProductName FROM Products WHERE Products.SupplierID = Suppliers.supplierID );
它可以毫无问题地工作并显示请求的行,但是当我尝试将子查询作为这样的查询运行时
SELECT ProductName FROM Products WHERE Products.SupplierID = Suppliers.supplierID ;
它告诉我供应商供应商ID是一个未知列,我错过了什么?
您认为查询是:
SELECT s.SupplierName
FROM Suppliers s
WHERE EXISTS (SELECT p.ProductName
FROM Products p
WHERE p.SupplierID = s.supplierID
);
但是,如果p.ProductName
不存在,则SQL会访问外部查询,并将其解释为:
SELECT s.SupplierName
FROM Suppliers s
WHERE EXISTS (SELECT s.ProductName
FROM Products p
WHERE p.SupplierID = s.supplierID
);
在这种情况下,它没有任何区别,因为EXISTS
只检查行的存在,而不是列。 我通常用SELECT 1
写这个。
也就是说,它可以在其他情况下产生影响。 因此,道德仍然适用:
Moral:始终限定所有列引用,尤其是在具有多个表引用的查询中。