0

Person テーブルと属性テーブルがあります。Person は 0 個以上の属性を持つことができるため、この関係を中間のキーと値のテーブルに格納します。

------------         --------------       ---------------
|Person     |        |key val tbl |       | attribute   |
 -----------         --------------       ---------------
|p_id|p_name|        | p_id |a_id |       | a_id |a_name|
| 1  |simon |        |  1   | 1   |       |  1   | tall |
| 2  |eric  |        |  1   | 2   |       |  2   | cool |
                     |  2   | 2   |

このようなものを返すクエリをどのように書くことができますか?

|name |attr1|attr2|  
|simon|tall |cool |
|eric |     |cool |

属性は 6 つまでしかなく、おそらく変更されることはありません。

ありがとう!

4

1 に答える 1

1

結合して集約する必要があります:

select p.name,
       max(case when a.a_id = 1 then a.a_name end) as attr1,
       max(case when a.a_id = 2 then a.a_name end) as attr2
from person p join
     keyval kv
     on p.key = kv.key join
     attribute a
     on kv.a_id = a.a_id
group by p.name

このクエリは 3 つのテーブルを結合し、個人/属性のペアごとに 1 つの行を含むテーブルを生成します。最後の group by は個人レベルで集計し、行全体で属性を「ピボット」します。max(case ...) 式は、 column の属性の値を選択するだけです。

于 2012-07-24T23:38:05.340 に答える