我正在使用PostgreSQL 9.3,我有这个:
ID | NAME
1 | N_A
2 | N_B
3 | N_C
ID | PARENT_TABLE_ID | KEY | VALUE
1 | 1 | K_A | V_A
2 | 1 | K_B | V_B
3 | 1 | K_C | V_C
5 | 2 | K_A | V_D
6 | 2 | K_C | V_E
7 | 3 | K_A | V_F
8 | 3 | K_B | V_G
9 | 3 | K_C | V_H
请注意,我可能会在KEY中添加K_D,它完全是动态的。
我想要的是一个返回以下内容的查询:
ID | NAME | K_A | K_B | K_C | others K_...
1 | N_A | V_A | V_B | V_C | ...
2 | N_B | V_D | | V_E | ...
3 | N_C | V_F | V_G | V_H | ...
这可能吗?如果是这样,怎么样?
答案 0 :(得分:0)
由于可能缺少值,因此您需要" safe" crosstab()
的形式,列名为第二个参数:
SELECT * FROM crosstab(
'SELECT p.id, p.name, c.key, c."value"
FROM parent_table p
LEFT JOIN child_table c ON c.parent_table_id = p.id
ORDER BY 1'
,$$VALUES ('K_A'::text), ('K_B'), ('K_C')$$)
AS t (id int, name text, k_a text, k_b text, k_c text; -- use actual data types
此相关答案的详情:
PostgreSQL Crosstab Query
关于添加"额外"列:
Pivot on Multiple Columns using Tablefunc