2017-09-10 14 views
1

これは、クエリを、古典的なEXISTSされています。しかし、私はこのクエリは、ほぼすべてのデータベースエンジンをで働くだろうが、私ので、それは、ANSI SQLで許可されていないことEXISTSがANSI SQLにあります。スーパークエリ内のテーブル名

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); 

言われてきましたメインクエリで明示的に指定されていないテーブルをサブクエリに命名しました。

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

クエリにエイリアスを追加します。 *読みやすいように少なくとも* – wildplasser

答えて

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)を使用する必要があります。

関連する問題