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

如何在SQL子选择中使用order by?,sql,oracle,oracle10g,sql-order-by,subquery,Sql,Oracle,Oracle10g,Sql Order By,Subquery,我有一个名为ConcatList的聚合函数,它将一个值列表连接成一个逗号分隔的值 下面是我正在尝试做的一个例子。我有两张桌子:雇员和工作。乔布斯是员工的“孩子”。我需要获得一个员工列表,其中包括一个以逗号分隔的与员工相关的工作列表,按工作名称排序 我想我可以做到这一点: select em.EmployeeId, em.EmployeeName, (select ConcatList(jo.JobName) from Job jo

我有一个名为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”子句中返回以下错误:

如果我去掉了“orderby”子句,这个SQL就可以工作,但是我需要对作业列表进行排序


如何实现这一点?

由于
ConcatList
是一个用户定义的聚合函数,因此修改
ConcatList
对结果排序或创建一个
ConcatSortedList
聚合函数对其聚合的数据进行排序似乎是有意义的。加里·迈尔斯(Gary Myers)就是一个例子


你也可以浏览Tim Hall网站上的各种网站。如果您必须生成一个排序列表,那么使用其中的许多技术将比试图保证非排序用户定义的聚合函数生成排序结果更容易。例如,当需要排序时,相对容易使用,因为您只需向光标添加一个
ORDER BY

因为
ConcatList
是一个用户定义的聚合函数,修改
ConcatList
对结果进行排序,或者创建一个
ConcatSortedList
聚合函数对它聚合的数据进行排序,这似乎是有意义的。加里·迈尔斯(Gary Myers)就是一个例子

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
你也可以浏览Tim Hall网站上的各种网站。如果您必须生成一个排序列表,那么使用其中的许多技术将比试图保证非排序用户定义的聚合函数生成排序结果更容易。例如,当需要排序时,相对容易使用,因为您只需向光标添加一个
orderby

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是一个分析-->

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
我认识到wm_concat是一个分析-->

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

您可以对关联的记录进行排序,然后聚合结果:

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

您可以对关联的记录进行排序,然后聚合结果:

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

如果在from子句中使用distinct关键字,则此解决方案有效。如果在from子句中使用distinct关键字,则此解决方案有效。