質問

存在する前にサブクエリの選択部分に何を入れますか?

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

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

役に立ちましたか?

解決

効率はあなたのプラットフォームに依存していると思います。 Oracleで、exists句内で *を選択して1を選択します。同一のメモリコストで同一の説明計画を生成します。違いはありません。ただし、他のプラットフォームは異なる場合があります。

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

  SELECT *

特定のフィールドを選択すると、読者がその特定のフィールドを気にかけていると考えるように誤解を招く可能性があるため、そのサブクエリをコピー /貼り付けて修正して実行して、出力を見ることができます。

ただし、SQLステートメントに存在する句は、コードの匂いが少しあります。それらがあなたが望むものを手に入れるための最良かつ最も明確な方法である場合がありますが、それらはほとんど常に結合として表現することができます。これは、データベースエンジンが最適化するのがはるかに簡単になります。

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

他のヒント

私も使用します1. nullを使用するいくつかの開発者を見ました。クエリは、サブクエリのSELECT句を実行するときにクエリが物理LOCから実際の値を取得する必要がないため、任意のフィールドから選択するのと比較して1は効率的だと思います。

使用する:

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

存在すると、指定された基準の1つ以上が一致する場合はtrueを返します - 列が実際にSELECT句で返されるかどうかは関係ありません。 nullは、比較がないことを明確にしますが、1/etcは以前にIN句で使用されていた有効な値である可能性があります。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top