2011-12-08 63 views
0

我有一個名爲ConcatList的聚合函數,它將值列表連接成單個逗號分隔值。如何在SQL子查詢中使用順序?

這是我正在嘗試做的一個例子。我有兩張表:員工和工作。工作是員工的「孩子」。我需要得到一份員工名單,其中包含與員工相關職位的逗號分隔列表,按工作名稱排序。

我想我能做到這一點:「按訂單」的條款

select em.EmployeeId, 
     em.EmployeeName, 
     (select ConcatList(jo.JobName) 
      from Job jo 
     where jo.EmployeeId = em.EmployeeId 
     order by jo.JobName) 
    from Employee em; 

然而,這將返回我下面的錯誤的:

ORA-00907: missing right parenthesis 

如果我得到擺脫「秩序「子句,這個SQL可以工作,但我需要對作業列表進行排序。

我該如何做這項工作?

回答

2

可以接合的記錄進行排序,然後彙總結果:

select EmployeeId, 
     EmployeeName, 
     ConcatList(JobName) 
from (
    select em.EmployeeId, 
      em.EmployeeName, 
      jo.JobName 
     from Employee em 
     join Job jo 
     on jo.EmployeeId = em.EmployeeId 
    order by jo.JobName 
    ) 
group by EmployeeId, 
     EmployeeName 
+0

如果在from子句中使用distinct關鍵字,則此解決方案有效。 – AndyGeek

1

由於ConcatList是用戶定義的集合函數,因此修改ConcatList以訂購結果或創建ConcatSortedList聚合函數可以對其聚合的數據進行排序似乎有意義。加里邁爾斯有一個user-defined aggregate function that produces a sorted list的例子。

您還可以瀏覽Tim Hall網站上的各種string aggregation techniques。如果您必須生成一個排序列表,那麼使用其中的許多技術會比保證用戶定義的非排序聚合函數產生排序結果容易得多。例如,generic function taking a REF CURSOR在需要排序時相對容易使用,因爲您只需向光標添加ORDER BY即可。

0
select em.EmployeeId, 
     em.EmployeeName, 
     wm_concat(jo.JobName) over 
      (partion by jo.EmployeeID order by JobName) as JobList 
    from Employee em 
    INNER JOIN JOB JO on jo.EmployeeId = em.EmployeeId 

從中我意識到wm_concat實施例是一個解析 - >http://www.tek-tips.com/viewthread.cfm?qid=1629662

文本2 =隨機文本

VAL =分組

Select val, text2, wm_concat(text2) over (partition by val order by text2) as out_text2 
from B 


Test results: 
VAL  text2     out_Text2 
1 XXX010105     (CLOB) XXX010105 
1 something XXX010101 somet (CLOB) XXX010105,... 
2 yet another XXX010102 and (CLOB) yet anothe... 
4 XXX010103     (CLOB) XXX010103 
5 a       (CLOB) a 
5 b       (CLOB) a,b 
5 c       (CLOB) a,b,c 
5 x       (CLOB) a,b,c,x 
6 a       (CLOB) a 
6 g       (CLOB) a,g 
6 i       (CLOB) a,g,i 
6 n       (CLOB) a,g,i,n 
6 x       (CLOB) a,g,i,n,x