2017-08-25 86 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

相關問題