テーブルの値を、同じテーブルの異なる値の2つの異なる列に取得したい。このクエリを例として使用します(2つの異なるテーブルとしてエイリアスされた同じテーブルで選択がどのように行われるかに注意してください)。
SELECT a.myVal, b.myVal
FROM MyTable a, MyTable b
WHERE
a.otherVal = 100 AND
b.otherVal = 200 AND
a.id = b.id
このような比較的単純なクエリをデータセットで実行すると、正常に機能します-時間がかかるだけです。このクエリを書くより良い/よりスマートな方法はありますか?
読みやすくするために、よりモダンな結合構文を使用してクエリを書き換えます。これにより、結合条件がフィルターから明確に分離されます。
select a.myVal,
b.myVal
from MyTable a
join MyTable b on b.id = a.id
where a.OtherVal = 100
and b.Otherval = 200
パフォーマンスのために、適切なインデックスがあることを確認してください。この限られた例では、理想的には、IDにクラスター化インデックスがあり、OtherValに非クラスター化インデックスがあるはずです。
ただし、クエリを確認した後、それが何を達成しようとしているのかはわかりません。
次のように、グループ化と条件付き集計を使用できます。
SELECT
id,
MAX(CASE OtherVal WHEN 100 THEN MyVal END) AS MyVal1,
MAX(CASE OtherVal WHEN 200 THEN MyVal END) AS MyVal2
FROM MyTable
WHERE OtherVal IN (100, 200)
GROUP BY
id
;