我有这样的结构:如何在没有子查询的情况下聚合一列中的行?
with
pages (id, sid, text) as (
select 1, 1, 'lorem ipsum' from dual union all
select 2, 1, 'lorem ipsum2' from dual union all
select 3, 1, 'lorem ipsum3' from dual union all
select 4, 1, 'lorem ipsum4' from dual),
responsible (id, pid, name, sirname) as (
select 1, 1, 'Alexey', 'Ivanov' from dual union all
select 2, 1, 'Igor', 'Petrov' from dual union all
select 3, 1, 'Dmitriy', 'Shestakov' from dual)
和这样的选择:
select
p.id, p.sid,
CASE
WHEN 1=1 THEN p.text
ELSE p.text
END AS "Important thing",
(select listagg (name || '-' || sirname, '; ') within group (order by id) from responsible where pid = p.sid) as "SA"
from
pages p
order by
p.id;
输出:
--------------------------
ID SID Important thing SA
1 1 lorem ipsum Alexey-Ivanov; Igor-Petrov; Dmitriy-Shestakov
2 1 lorem ipsum2 Alexey-Ivanov; Igor-Petrov; Dmitriy-Shestakov
3 1 lorem ipsum3 Alexey-Ivanov; Igor-Petrov; Dmitriy-Shestakov
4 1 lorem ipsum4 Alexey-Ivanov; Igor-Petrov; Dmitriy-Shestakov
它的工作,因为我想要的。它添加到每个pages.id所有负责人。名字+ sirname的。 但我不喜欢我使用嵌套查询,因为在真实的数据库中有超过9000页的页面。所以我很害怕这个SQL查询将不会那么快,数据库管理员将惩罚我:)
我知道,我可以使用JOIN,但我不知道如何为每个页面聚合所有名称+ sirname。 SID。我想,我可以使用listagg,但正如我所知,Oracle不能'别名'(“重要的事情”)。
所以,我需要你的建议。对于我来说,让这个查询更快一点并不重要,我想知道如何以另一种方式解决这个任务。
你应该包括你想要或已经输出。 –
Oracle拥有智能优化器。不要担心使用子查询或CTE。 –
@TimBiegeleisen完成, – newSqlz