如何在SQL子选择中使用order by?

时间:2011-12-08 18:05:13

标签: sql oracle oracle10g sql-order-by subquery

我有一个名为ConcatList的聚合函数,它将值列表连接成一个逗号分隔值。

这是我想要做的一个例子。我有两个表:员工和工作。工作是员工的“孩子”。我需要获得一份员工列表,其中包括以逗号分隔的与员工相关的工作列表,并按工作名称排序。

我以为我可以这样做:

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

但是,这会在“order by”子句中返回以下错误:

ORA-00907: missing right parenthesis

如果我摆脱了“order by”子句,这个SQL可行,但我需要对作业列表进行排序。

我该如何做到这一点?

3 个答案:

答案 0 :(得分: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

答案 1 :(得分: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即可。

答案 2 :(得分: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

Text2 =随机文字

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