2017-08-25 40 views
1

我有这样的结构:如何在没有子查询的情况下聚合一列中的行?

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不能'别名'(“重要的事情”)。

所以,我需要你的建议。对于我来说,让这个查询更快一点并不重要,我想知道如何以另一种方式解决这个任务。

+0

你应该包括你想要或已经输出。 –

+1

Oracle拥有智能优化器。不要担心使用子查询或CTE。 –

+0

@TimBiegeleisen完成, – newSqlz

回答

0

取而代之的是SELECT子句中使用子查询的,可以转而加入一个子查询其是否为文字集合:

SELECT 
    p.id, 
    p.sid, 
    p.text AS "Important thing", 
    r.sa 
FROM pages p 
LEFT JOIN 
(
    SELECT 
     pid, 
     LISTAGG (name || '-' || sirname, '; ') WITHIN GROUP (ORDER BY id) AS sa 
    FROM responsible 
) r 
    ON r.pid = p.sid 
ORDER BY p.id; 

您当前的方法使用相关子查询,其中甲骨文或许不能优化多。这种连接方法使用了不相关的子查询,而Oracle已经欺骗了它,使其运行得更快。

+0

有趣的方式,谢谢:) – newSqlz

0

在这种情况下,您可以简化您的查询:

select p.id, p.sid, p.text, 
     listagg (name || '-' || sirname, '; ') within group (order by r.id) SA 
    from pages p 
    left join responsible r on r.pid = p.sid 
    group by p.id, p.sid, p.text 
    order by p.id; 
+0

不,我不能。我有1列与别名。这个“CASE”结构就是例子,但在真正的查询中我必须使用大小写和别名 – newSqlz

相关问题