存在する前にサブクエリの選択部分に何を入れますか?
質問
存在する前にサブクエリの選択部分に何を入れますか?
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句で使用されていた有効な値である可能性があります。