Как я могу использовать order by в подвыборке SQL? - PullRequest
0 голосов
/ 08 декабря 2011

У меня есть агрегатная функция 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 ]

2 голосов
/ 08 декабря 2011

Вы можете отсортировать объединенные записи и затем агрегировать результат:

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 голос
/ 08 декабря 2011

Поскольку ConcatList является определяемой пользователем статистической функцией, представляется целесообразным либо изменить ConcatList для упорядочивания результатов, либо создать ConcatSortedList статистическую функцию, которая сортирует агрегируемые данные.У Гэри Майерса есть пример пользовательской агрегатной функции, которая создает отсортированный список .

. Вы также можете воспользоваться различными методами агрегирования строк на сайте Тима Холла,Если вам нужно создать отсортированный список, использовать многие из этих методов будет проще, чем пытаться гарантировать, что несортируемая пользовательская агрегатная функция даст отсортированный результат.Например, универсальная функция , использующая REF CURSOR , относительно проста в использовании, когда требуется сортировка, поскольку вы можете просто добавить ORDER BY к курсору.

0 голосов
/ 08 декабря 2011
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
...