我有一个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个属性,不太可能改变。
谢谢!
答案 0 :(得分: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
此查询将三个表连接在一起,这将生成一个表,每个人/属性对都有一行。最后一组通过人员级别的聚合,“旋转”整个行的属性。 max(case ...)表达式只是选择列的属性值。