我有一个名为 requesttool.request_detail 的表,用于存储由REQUEST_ID列中的值标识的实体的属性。表 requesttool.request_detail 有一个名为ATTRIBUTE_ID的列,它指示存储在名为ATTRIBUTE_VALUE的另一列的相应行中的内容。例如,如果给定行的ATTRIBUTE_ID ='259',则名称将存储在相应的ATTRIBUTE_VALUE行中。
以下是 requesttool.request_detail 在实践中的样子:
我想要做的是为3个不同的ATTRIBUTE_ID和给定的REQUEST_ID(例如4500161635)提取存储在ATTRIBUTE_VALUE中的值,并将它们显示在一行中,如下所示:
我尝试过以下代码:
select
request_id,
case when attribute_id = '289' then attribute_value end as name,
case when attribute_id = '259' then attribute_value end as country,
case when attribute_id = '351' then attribute_value end as priority
from (
select a.request_id, a.attribute_id, a.attribute_value
from requesttool.request_detail a
where a.request_id='4500161635');
但是从这里我获得了一个具有空值的表,而不是一行:
答案 0 :(得分:1)
你走在正确的轨道上。只有你必须聚合你的行,以便每个request_id获得一个结果行:
select
request_id,
max(case when attribute_id = '289' then attribute_value end) as name,
max(case when attribute_id = '259' then attribute_value end) as country,
max(case when attribute_id = '351' then attribute_value end) as priority
from requesttool.request_detail
where request_id = '4500161635'
group by request_id;
给定request_id + attribute_id的索引,您可以通过在where子句中添加条件来加快速度:
and attribute_id in ('289', '259', '351')
BTW:request_id和attribute_id是否真的是字符串?为什么你在数字上使用引号?
答案 1 :(得分:1)
试试这个
select
request_id,
MIN(case when attribute_id = '289' then attribute_value end) as name,
MIN(case when attribute_id = '259' then attribute_value end) as country,
MIN(case when attribute_id = '351' then attribute_value end) as priority
from (
select a.request_id, a.attribute_id, a.attribute_value
from requesttool.request_detail a
where a.request_id='4500161635')
GROUP BY request_id