LISTAGG дал ошибку "не выражение GROUP BY" - PullRequest
0 голосов
/ 22 апреля 2020

Я пытаюсь добавить текстовое поле a.des c в рабочий запрос Oracle, используя LISTAGG. Может ли кто-нибудь помочь с разрешением этой синтаксической ошибки?

У меня есть 3 таблицы
1) Таблица A

id  |  Name      |   Desc     |  
1   |  Name_A_1  |  Desc_A_1  |  
2   |  Name_A_2  |  Desc_A_2  |  
3   |  Name_A_3  |  Desc_A_3  |  

2) Таблица B

id  |  Name      |   Desc     |  
11  |  Name_B_11 |  Desc_B_11 |  
12  |  Name_B_12 |  Desc_B_12 |  
13  |  Name_B_13 |  Desc_B_13 |  

3 ) Таблица C

id  | Table_A_id  | Table_B_id  |  
1   |    1        |     11      |  
2   |    1        |     12      |  
3   |    1        |     13      |  
4   |    3        |     12      |  
5   |    3        |     13      |  
  • Вот что работает с токовым выходом
A id | A Name   |  B id(s)   |  
  1  | Name_A_1 | 11; 12; 13 |  
  3  | Name_A_3 | 12; 13     |
Select A.id AS "A id", A.Name AS "A Name",
       LISTAGG(C.id,'; ') WITHIN GROUP (ORDER BY A.id) AS "B id(s)"
From Table_A A
     INNER JOIN Table_C C ON A.id = C.id
     INNER JOIN Table_B B ON B.id = C.id
GROUP BY A.id, A.Name
ORDER BY A.id
  • Вот первый желаемый вывод: добавление столбца «A Des c»:
    A id | Имя | A Des c | B id (s) |
    1 | Имя_А_1 | Desc_A_1 | 11; 12; 13 |
    3 | Имя_А_3 | Desc_A_3 | 12; 13 |
Select A.id AS "A id", A.Name AS "A Name", A.Desc AS "A Desc",
       LISTAGG(C.id,'; ') WITHIN GROUP (ORDER BY A.id) AS "B id(s)"
From Table_A A
     INNER JOIN Table_C C ON A.id = C.id
     INNER JOIN Table_B B ON B.id = C.id
GROUP BY A.id, A.Name, A.Desc
ORDER BY A.id

** Я получаю сообщение об ошибке "не выражение GROUP BY"

  • Вот второй желаемый вывод (с Name_B_ #) добавлено в последний столбец:
A id | A Name   |  A Desc  |  B id(s)   |  
  1  | Name_A_1 | Desc_A_1 | 11(Name_B_11); 12(Name_B_12); 13(Name_B_13) |  
  3  | Name_A_3 | Desc_A_3 | 12(Name_B_12); 13(Name_B_13)                |  

Я не дошел до этого, застрял в запросе выше. В этом разделе я хочу добавить Таблицу B c к каждому B.id.

Заранее благодарю за помощь!

1 Ответ

0 голосов
/ 22 апреля 2020

Я попробовал следующий запрос, и он работает с вашими примерами данных

    Select A.id1 AS "A id", A.Name1 AS "A Name", A.Desc1 AS "A Desc",
    LISTAGG(C.Table_B_id,'; ') WITHIN GROUP (ORDER BY A.id1) AS "B id(s)"
    From  A
    INNER JOIN  C ON A.id1 = C.Table_A_id
    INNER JOIN  B ON B.id1 = C.Table_B_id
    GROUP BY A.id1, A.Name1, A.Desc1
    ORDER BY A.id1

Ответ на ваш второй вопрос ниже

   Select A.id1 AS "A id", A.Name1 AS "A Name", A.Desc1 AS "A Desc",
   LISTAGG(C.Table_B_id||'('||B.Name1||')','; ') WITHIN GROUP (ORDER BY 
   A.id1) AS "B id(s)"
   From  A
   INNER JOIN  C ON A.id1 = C.Table_A_id
   INNER JOIN  B ON B.id1 = C.Table_B_id
   GROUP BY A.id1, A.Name1, A.Desc1
   ORDER BY A.id1
...