2012-03-06 19 views
0

私はこのテーブルを持っている:を選択し、いくつかの行に基づく値と列

id  characteristic  value 
1   color   blue 
1   shape   rectangle 
2   color   green 
2   shape   triangle 

私は色や形状に基づいてIDを選択する必要は、例えば、私は色が青のIDを選択したいと形状は長方形です(値1のみを返します)。

主キーはコンポジット(id +特性)なので、idは特性に対して複数の値を持つことはありません。

また、多かれ少なかれ特性を持つ可能性があります。

誰でも私にこのことを教えてもらえますか?

敬具

+1

明らかに最適でないテーブルデザイン...構造を書き換えることが可能です。これは他のクエリにとっても悪夢となる可能性があるためです。 –

+0

何を試しましたか?どこに掛けられていますか?エラーや予期しない結果が出ていますか? –

+0

Ryan Kempt、残念ながらそれはどうしてそうであるか... –

答えて

2
SELECT id 
    FROM MyTable t 
     JOIN MyTable t2 ON t.id = t2.id 
WHERE t.characteristic = 'color' AND t.value ='blue' 
    AND t2.characteristic = 'shape' AND t2.value='rectangle' --just fixed the t1 to t2 
+0

私は考慮して3行を取りたい場合、私はMyTableの3番目の表現を持っている必要があった、t3のような?私が50行を比較したければ、それは50 "t"(t50)でしょうか? –

+0

によると、テーブルデザインは、はい。 – Akhil

2

あなたはあまりにも多くを変更する必要はありません別のアプローチであれば条件変更の数:

with conditions as (
    select 'color' as characterstic, 'blue' as value from dual 
    union all 
    select 'shape' as characterstic, 'rectangle' as value from dual 
) 
select id 
from characteristics c2 
where (characteristic, value) in (select characteristic, value from conditions) 
group by id 
having count(*) = (select count(*) from conditions) 

あなただけの別の「行」を追加する必要がありそうすればCTEでは他のものを変更する必要はありません。

+0

私はあなたのソリューションが気に入っていますが、その特性がその値ではないか、文字列などが含まれているかどうかを確認する必要もありますので、私はAkhilと一緒にいますね!あなたの答えをありがとう、しかし、私は今ではなかった "とxyz" –

関連する問題