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

此查询将三个表连接在一起,这将为每个人/属性对生成一个包含一行的表。最后的 group by 在人员级别聚合,“透视”行中的属性。max(case ...) 表达式只是选择 column 的属性值。

于 2012-07-24T23:38:05.340 回答