1

サブクエリの Select 部分の前に Exists がある場合、何を入力しますか?

Select *  
  From some_table  
 Where Exists (Select 1  
                From some_other_table  
               Where some_condition )

私は通常 1 を使用します。以前は * を使用していましたが、無駄なオーバーヘッドが追加される可能性があることに気付きました。何を入れますか?1 またはその他のダミー値を入れるよりも効率的な方法はありますか?

4

3 に答える 3

1

私も 1 を使用しています。null を使用している開発者を見たことがあります。サブクエリのselect句を実行するときにクエリが物理的な場所から実際の値を取得する必要がないため、任意のフィールドから選択するよりも1が効率的だと思います。

于 2009-10-06T17:16:43.077 に答える
1

効率はプラットフォームに依存すると思います。Oracle では、EXISTS 句内の SELECT * および SELECT 1 は、同一のメモリ コストで同一の Explain Plan を生成します。違いはありません。ただし、他のプラットフォームは異なる場合があります。

個人的な好みの問題として、私は使用します

  SELECT *

特定のフィールドを SELECT すると、読者がその特定のフィールドを気にかけていると誤解する可能性があるため、そのサブクエリをコピーして貼り付け、変更せずに実行して出力を確認することもできます。

ただし、SQL ステートメントの EXISTS 句は少しコードのにおいがします (IMO)。必要なものを取得するための最良かつ最も明確な方法である場合もありますが、ほとんどの場合、結合として表現できるため、データベース エンジンが最適化するのがはるかに簡単になります。

SELECT *
FROM SOME_TABLE ST
WHERE EXISTS(
  SELECT 1
  FROM SOME_OTHER_TABLE SOT
  WHERE SOT.KEY_VALUE1 = ST.KEY_VALUE1
    AND SOT.KEY_VALUE2 = ST.KEY_VALUE2
  ) 

以下と論理的に同一です。

SELECT *
FROM
  SOME_TABLE ST
  INNER JOIN
  SOME_OTHER_TABLE SOT
  ON ST.KEY_VALUE1 = SOT.KEY_VALUE1
    AND ST.KEY_VALUE2 = SOT.KEY_VALUE2
于 2009-10-06T17:16:50.640 に答える
1

使用する:

WHERE EXISTS (SELECT NULL
                FROM some_other_table  
               WHERE ... )

EXISTS は、指定された基準の 1 つ以上が一致する場合に true を返します。列が実際に SELECT 句で返されるかどうかは問題ではありません。NULL は、1/etc が以前に IN 句で使用された有効な値である可能性がある一方で、比較がないことを明示するだけです。

于 2009-10-06T17:28:13.050 に答える