【问题标题】:How can I use order by in a SQL subselect?如何在 SQL 子选择中使用 order by?
【发布时间】:2011-12-08 18:05:12
【问题描述】:

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

这是我正在尝试做的一个例子。我有两个表:Employee 和 Job。 Job 是 Employee 的“孩子”。我需要获取员工列表,其中包含与员工相关的工作的逗号分隔列表,按工作名称排序。

我认为我可以这样做:

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 可以工作,但我需要对作业列表进行排序。

我怎样才能做到这一点?

【问题讨论】:

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


    【解决方案1】:

    您可以对连接的记录进行排序,然后汇总结果:

    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 关键字,则此解决方案有效。
    【解决方案2】:

    由于ConcatList 是一个用户定义的聚合函数,修改ConcatList 以对结果进行排序或创建一个ConcatSortedList 聚合函数来对其聚合的数据进行排序似乎是有意义的。 Gary Myers 有一个user-defined aggregate function that produces a sorted list 的示例。

    您还可以浏览 Tim Hall 网站上的各种 string aggregation techniques。如果您必须生成排序列表,那么使用其中许多技术会比尝试保证非排序用户定义的聚合函数产生排序结果更容易。例如,generic function taking a REF CURSOR 在需要排序时相对容易使用,因为您只需在光标上添加一个ORDER BY

    【讨论】:

      【解决方案3】:
      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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多