我有一个项目表,由其唯一ID标识,以及一些属性。
为保持表的可读性,该属性始终存储在“prop_value”列中,其类型存储在“prop_type”列中
为了简化,我只使用了三个属性,实际上有12个。
+----+-------------+-------------+
+ ID + prop_type + prop_value +
+----+-------------+-------------+
+ 1 + prop1 + foo +
+----+-------------+-------------+
+ 1 + prop3 + toto +
+----+-------------+-------------+
+ 3 + prop2 + lorem +
+----+-------------+-------------+
目的是获取sigle行中项目的所有属性,结果如下:
+----+-------------+-------------+-------------+
+ ID + prop1 + prop2 + prop3 +
+----+-------------+-------------+-------------+
+ 1 + foo + NULL + toto +
+----+-------------+-------------+-------------+
+ 2 + NULL + lorem + NULL +
+----+-------------+-------------+-------------+
一开始,我使用了一个非常难看的解决方案:
select prop1 from myTable where id = 1
select prop2 from myTable where id = 1
...
既然我正在扩展它,它将永远消失,我想在一个查询中进行。
我尝试过类似的事情:
select a.prop_value, b.prop_value, c.prop_value from myTable a FULL JOIN myTable b FULL JOIN myTable c ...
但感觉我正在进入比它需要的更复杂的东西。
是否有实现这一目标的紧凑型解决方案?谢谢你的帮助。
答案 0 :(得分:3)
使用PIVOT
:
SELECT *
FROM your_table
PIVOT ( MAX( prop_value ) FOR prop_type IN (
'prop1' AS prop1,
'prop2' AS prop2,
'prop3' AS prop3
) )
答案 1 :(得分:1)
您可以使用某些条件逻辑(例如CASE
语句)以及聚合函数来获取结果:
select Id,
max(case when prop_type = 'prop1' then prop_value end) as Prop1,
max(case when prop_type = 'prop2' then prop_value end) as Prop2,
max(case when prop_type = 'prop3' then prop_value end) as Prop3
from myTable
group by Id;
此类查询将行值转换为列。