选择独立行并将它们显示为单行 (ORACLE SQL)
Posted
技术标签:
【中文标题】选择独立行并将它们显示为单行 (ORACLE SQL)【英文标题】:Selecting independent rows and displaying them into a single row (ORACLE SQL) 【发布时间】:2016-10-06 07:28:33 【问题描述】:我有一个名为 requesttool.request_detail 的表,用于存储由 REQUEST_ID 列中的值标识的实体的属性。 requesttool.request_detail 表有一个名为 ATTRIBUTE_ID 的列,它指示存储在另一个名为 ATTRIBUTE_VALUE 的列的相应行中的内容。例如,如果给定行的 ATTRIBUTE_ID='259',则名称将存储在 ATTRIBUTE_VALUE 的相应行中。
这是 requesttool.request_detail 在实践中的样子:
我想要做的是提取存储在 ATTRIBUTE_VALUE 中的 3 个不同 ATTRIBUTE_ID 和给定 REQUEST_ID 的值,比如 4500161635,并将它们显示在一行中,如下所示:
我已经尝试了以下代码:
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');
但我从中获得了一个包含空值的表,而不是一行:
【问题讨论】:
您可以按 Request_id 分组并为所有 3 列选择 max(case ..)。 【参考方案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')
顺便说一句:request_id 和 attribute_id 真的是字符串吗?或者你为什么在数字上使用引号?
【讨论】:
【参考方案2】:试试这个
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
【讨论】:
以上是关于选择独立行并将它们显示为单行 (ORACLE SQL)的主要内容,如果未能解决你的问题,请参考以下文章