Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/82.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 排成一行';通过键值表定义属性_Sql_Sqlite_Join - Fatal编程技术网

Sql 排成一行';通过键值表定义属性

Sql 排成一行';通过键值表定义属性,sql,sqlite,join,Sql,Sqlite,Join,我有一个Person表和一个attribute表。一个人可以有0个或多个属性,所以我将此关系存储在中间键值表中,例如 ------------ -------------- --------------- |Person | |key val tbl | | attribute | ----------- -------------- --------------- |p_id|p_name|

我有一个Person表和一个attribute表。一个人可以有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个属性,这不太可能改变


谢谢

您需要加入并聚合:

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?