通过键值表获取所有行的属性

时间:2012-07-24 23:25:23

标签: sql sqlite join

我有一个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个属性,不太可能改变。

谢谢!

1 个答案:

答案 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 ...)表达式只是选择列的属性值。