Sql 排成一行';通过键值表定义属性
我有一个Person表和一个attribute表。一个人可以有0个或多个属性,所以我将此关系存储在中间键值表中,例如Sql 排成一行';通过键值表定义属性,sql,sqlite,join,Sql,Sqlite,Join,我有一个Person表和一个attribute表。一个人可以有0个或多个属性,所以我将此关系存储在中间键值表中,例如 ------------ -------------- --------------- |Person | |key val tbl | | attribute | ----------- -------------- --------------- |p_id|p_name|
------------ -------------- ---------------
|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个属性,这不太可能改变
谢谢 您需要加入并聚合:
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…)表达式只选择列的属性值。请解释一下选择部分好吗?我根本不明白那里发生了什么事!嘿,有没有办法让它同时返回没有任何属性的行?@Simonw。要获取没有属性的行,请将联接更改为左外部联接。“select”部分只是使用case语句来选择一个或另一个属性id?