web-dev-qa-db-ja.com

同じテーブルから2つの値を選択するが、条件は異なる

テーブルの値を、同じテーブルの異なる値の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

このような比較的単純なクエリをデータセットで実行すると、正常に機能します-時間がかかるだけです。このクエリを書くより良い/よりスマートな方法はありますか?

8
mattw

読みやすくするために、よりモダンな結合構文を使用してクエリを書き換えます。これにより、結合条件がフィルターから明確に分離されます。

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に非クラスター化インデックスがあるはずです。

ただし、クエリを確認した後、それが何を達成しようとしているのかはわかりません。

10
datagod

次のように、グループ化と条件付き集計を使用できます。

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
;
4
Andriy M