选择独立行并将它们显示为单行(ORACLE SQL)

时间:2016-10-06 07:28:34

标签: sql oracle

我有一个名为 requesttool.request_detail 的表,用于存储由REQUEST_ID列中的值标识的实体的属性。表 requesttool.request_detail 有一个名为ATTRIBUTE_ID的列,它指示存储在名为ATTRIBUTE_VALUE的另一列的相应行中的内容。例如,如果给定行的ATTRIBUTE_ID ='259',则名称将存储在相应的ATTRIBUTE_VALUE行中。

以下是 requesttool.request_detail 在实践中的样子:

enter image description here

我想要做的是为3个不同的ATTRIBUTE_ID和给定的REQUEST_ID(例如4500161635)提取存储在ATTRIBUTE_VALUE中的值,并将它们显示在一行中,如下所示:

enter image description here

我尝试过以下代码:

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');

但是从这里我获得了一个具有空值的表,而不是一行:

enter image description here

2 个答案:

答案 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