は値

2012-03-10 3 views
0

私はすべてのIDと名前を選択して、いくつかの特徴とそれぞれの値を取得する必要があり、この1は値

id  name  characteristic  value  isList 
1  cube   sides   6   0 
1  cube   color   blue  0 
2 triangle  sides   3   0 
3 hexagon  (null)  (null)  (null) 
4 rectangle  weight   15   0 

のような見解を持っているを選択するために、独自のテーブルに参加しましょう。たとえば、すべての図形(ID 1,2,3,4)と特性の面と色(使用可能な場合は、IDと名前のみが塗りつぶされ、その他は空白)を取得したいとします。

私は

select * 
from shapes_view 
where (id = 1 or id = 2 or id = 3 or id = 4) and (characteristic like 'sides' or characteristic like 'color') 

を試みたが、それは、明らかに、ID 1と2ではなく3と4

を取得する私の推測では、私はこれを行うには、サブクエリのいくつかの並べ替えを必要とするということですが、ときに私自分自身でこのビューに参加しようとすると、私は必要なものの近くにない組み合わせの長いリストを取得します。私が取得するつもり何

は私がすべての値を選択して、私はJava側にないものを何をすべきかを除外することができます知っている

id  name  characteristic  value  isList 
1  cube   sides   6   0 
1  cube   color   blue  0 
2 triangle  sides   3   0 
3 hexagon  (null)  (null)  (null) 
4 rectangle  (null)  (null)  (null) 

のようなものですが、それは非常に正しい...

を鳴りません

誰でも私にこのことを教えてもらえますか? 敬具あなたが実際に、自己のカップルが

select all_ids.id, 
     all_ids.name, 
     s.value sides, 
     c.value color 
    from shapes_view all_ids 
     left outer join (select * 
          from shapes_view 
         where characteristic = 'sides') s 
       on(s.id = all_ids.id) 
     left outer join (select * 
          from shapes_view 
         where characteristic = 'color') c 
       on(c.id = all_ids.id) 

それとも、

select id, 
     name, 
     max(case when characteristic = 'sides' 
       then value 
       else null 
       end) sides, 
     max(case when characteristic = 'color' 
       then value 
       else null 
       end) color 
    from shapes_view 
group by id, name 

に抽出するために必要なクエリの複雑さを、データをピボット可能に合流join--自己を使用することができます

答えて

1

N個の異なる属性のデータは、このような非常に一般的なエンティティ属性値データモデルが一般的に悩まされる理由の1つです。

0

たぶん私は何かが足りないんだけど、これはあなたが必要とするすべてであるように聞こえる:

select 
    name, 
    characteristic, 
    case when characteristic in ('sides','color') then value else null end as value, 
    case when characteristic in ('sides','color') then isList else null end as isList 
from shapes_view 
where id in (1,2,3,4) 
and characteristic in ('sides','color')