Соедините две таблицы, используя LISTAGG или другие функции объединения - PullRequest
0 голосов
/ 07 мая 2018

У меня есть следующие две таблицы:

Subject
-----------------------------------------------
   ID    | SUBJECT_ID | FIRST_NAME | LAST_NAME 
-----------------------------------------------
2456969  |  0002531   |    Sam     |   White
1371093  |  0002301   |    Tom     |   Andrew
2456840  |  0002529   |    Chris   |   Williams


Subject Countries
--------------------------------
   ID    | ID_OWNER | COUNTRIES  
--------------------------------
2445162  |  2444907 |   303
2457722  |  2457721 |   302
2457650  |  2457649 |   211

Мне нужно использовать функцию LISTAGG или какую-либо другую функцию конкатенации, чтобы объединить две таблицы и вывести значения для "Страны" в одну строку.

Мой текущий запрос выглядит следующим образом:

sql.append("SELECT s.id, ");
sql.append("     s.subject_id AS subjectId, "); 
sql.append("     s.first_name AS firstName, "); 
sql.append("     s.last_name AS lastName, ");
sql.append("     listagg(sc.countries, ', ') within group (order by sc.countries) AS countriesOfCit ");
sql.append("FROM t_subject s ");
sql.append("     JOIN m_subject_countries sc ");
sql.append("     ON s.id = sc.id_owner ");
sql.append("     group by s.id ");

и я получаю сообщение об ошибке «ORA-00979: не выражение GROUP BY»

Ответы [ 2 ]

0 голосов
/ 08 мая 2018

Вы группируете по t_subject.id и ожидаете, что сможете выбрать все функционально зависимые столбцы, такие как t_subject.first_name и t_subject.last_name. Это действительно в соответствии со стандартом SQL.

Oracle, однако, здесь не соответствует стандарту и требует от вас явного названия всех столбцов в предложении GROUP BY, которые вы хотите выбрать неагрегированными.

group by s.id, s.subject_id, s.first_name, s.last_name

должен решить эту проблему.

Другим решением является объединение перед объединением:

SELECT 
  s.id, 
  s.subject_id AS subjectId,  
  s.first_name AS firstName,  
  s.last_name AS lastName, 
  sc.countriesOfCit 
FROM t_subject s
JOIN 
(
  select
    id_owner,
    listagg(countries, ', ') within group (order by countries) AS countriesOfCit 
  from m_subject_countries
  group by id_owner
) sc ON sc.id_owner = s.id;
0 голосов
/ 07 мая 2018

Все столбцы (не содержащиеся в LISTAGG) должны быть в предложении GROUP BY: s.id, s.subject_id, s.first_name, s.last_name

...