2016-06-15 10 views
1

私はこのようになりますテーブルを持っている:参照の値を取得します

ref key  val 
-------------------------- 
1  Include Yes 
1  Color  Green 
1  Shape  Square 
2  Include No 
2  Color  Red 
2  Shape  Circle 

Includeキーが値Yesで存在している場合、私は同じREFとすべての値を取得したいのですが。

したがって、上記の例のための結果は次のようになります。

ref key  val 
-------------------------- 
1  Include Yes 
1  Color  Green 
1  Shape  Square 

これは私がこれまで持っているものです。

select * 
from ref_table 
where ref in 
(
    select ref 
    from ref_table 
    where key = 'Include' and val = 'Yes' 
) 

また、これは動作するようです:ちょうど

with included 
as 
(
    select ref 
    from ref_table 
    where key = 'Include' and val = 'Yes' 
) 

select * 
from ref_table 
where ref in 
(
    select * from included 
) 

これを行うためのより良い(より単純な)方法があるかどうか疑問に思う。

+1

が、両方の方法が細かいです。 –

答えて

3

あなたはEXISTS()使用することができます。

SELECT * FROM ref_table t 
WHERE EXISTS(SELECT 1 FROM ref_table s 
      WHERE t.ref = s.ref and s.key = 'Include' and s.val = 'Yes') 

私はいつもそれがより良い実行時間のほとんどは、(最初​​のレコードを返すために待つが存在する)、IN()上でこの方法を好む、それはまた、その目的のために、より明確です。 IN()は、NULL値を返すことができるときにも問題が発生することがあります。

もう一つの方法は、INNER JOIN次のとおりです。OUTERが適用と

SELECT t.* FROM ref_table t 
INNER JOIN ref_table s 
ON(t.ref = s.ref and s.key = 'Include' and s.val = 'Yes') 
+0

私は質問を作成したときにそれはちょうどタイプミスでした。両方のクエリが動作します。これが実際に行う方法であるか、より良い方法があるかどうかは疑問です。 – Aetherix

+0

さて、私はそれを見て固定しました。 @Aetherix –

0

もう一つの方法が、私はそれがはるかに簡単ではないと思います。私は `exists`を使用することになり

SELECT r.* 
FROM ref_table r 
OUTER APPLY (
    SELECT DISTINCT ref 
    FROM ref_table 
    WHERE [key] = 'Include' and val = 'Yes') p 
WHERE p.ref = r.ref 
関連する問題