【问题标题】:Why I'm getting ORA-00979 while trying to use LISTAGG and LEFT JOIN?为什么我在尝试使用 LISTAGG 和 LEFT JOIN 时得到 ORA-00979?
【发布时间】:2019-07-09 12:26:33
【问题描述】:

我正在尝试group 我的结果,而不是看起来像这样:

id  | nome  |  bairro
---------------------
1 . |Test 1 | bairro 1
1 . |Test 1 | bairro 2
2 . |Test 2 | bairro 3

看起来像这样:

id  | nome  |  bairro
----------------------
1 . |Test 1 | bairro 1, bairro 2
2 . |Test 2 | bairro 3

“id”和“nome”在表 1 中,“bairro”在“nome”列中的table 3

表 1

id  | nome  | situacao
--------------------
1 . |Test 1 | EM_ATIVIDADE
2 . |Test 2 | EM_ATIVIDADE

表 2

id  | escola (fgk table 1) | bairro (fgk table 3)
-------------------------------------------------
1 . | 2                    | 1
2 . | 2                    | 2

表 3

id  | nome     
---------------
1 . | bairro 1 
2 . | bairro 2 

我正在尝试使用LISTAGG 和以下代码:

SELECT table1.nome, table1.id, LISTAGG(table3.nome, ', ') WITHIN GROUP (ORDER BY table3.nome) as "bairro"
FROM table1
LEFT JOIN table2 on table2.escola = table1.id
LEFT JOIN table3 on table3.id = table2.bairro
WHERE table1.situacao = 'EM_ATIVIDADE'
GROUP BY table1.id, table1.nome
ORDER BY table1.id

当我这样做时,我得到了错误

ORA-00979:不是按表达式分组

有人可以帮助我吗?我是初学者

edit:已经尝试将table1.nome 添加到我的群组中。

【问题讨论】:

  • 只需将 table1.nome 添加到您的组中
  • 刚刚做了,还是一样的错误 (ORA-00979)
  • table2.nome 应该是 LISTAGG 中的 table3.nome
  • 编辑后的查询对我有用。 dbfiddle.uk/…
  • 你应该把你的代码放到rextester.com/l/oracle_online_compiler 会让别人更快地解决/给你正确的答案。

标签: sql oracle select left-join listagg


【解决方案1】:

尝试将您的代码修改为以下内容;

SELECT table1.nome, table1.id, LISTAGG(table1.nome, ', ') WITHIN GROUP (ORDER BY table1.nome, table1.id) as "bairro"
FROM table1
LEFT JOIN table2 on table2.escola = table1.id
LEFT JOIN table3 on table3.id = table2.bairro
WHERE table1.situacao = 'EM_ATIVIDADE'
GROUP BY table1.id, table1.nome
ORDER BY table1.id, table1.nome

我在GROUP BY 中添加了您所有非 LISTAGG 选择的列,我还将它们添加到您的 LISTAGG's ORDER BY 子句中。

除此之外,我还在您的整个查询中添加了 table1.nomeORDER BY,因为我发现执行后它会明显更好。

希望我能帮上忙!

【讨论】:

    【解决方案2】:

    我认为这是因为您使用的是返回单行的聚合函数,以及返回多行的列。因此,您需要对 GROUP BY 子句中的每个“正常”列进行分组,或者对“正常”列中的值应用一些聚合函数,例如 MIN、MAX、SUM 等。

    在你的例子中,它会是这样的

    SELECT table1.nome, table1.id, LISTAGG(table2.nome, ', ') WITHIN GROUP (ORDER BY table2.nome) as "bairro"
    FROM table1
    LEFT JOIN table2 on table2.escola = table1.id
    LEFT JOIN table3 on table3.id = table2.bairro
    WHERE table1.situacao = 'EM_ATIVIDADE'
    GROUP BY table1.nome, table1.id
    ORDER BY table1.id
    

    SELECT MAX(table1.nome), MAX(table1.id), LISTAGG(table2.nome, ', ') WITHIN GROUP (ORDER BY table2.nome) as "bairro"
    FROM table1
    LEFT JOIN table2 on table2.escola = table1.id
    LEFT JOIN table3 on table3.id = table2.bairro
    WHERE table1.situacao = 'EM_ATIVIDADE'
    ORDER BY table1.id
    

    还有一个替代方法,就是使用

    OVER (partition BY <column name here>) 
    

    子句,例如像

    SELECT table1.nome, table1.id, LISTAGG(table3.nome, ', ') WITHIN GROUP (ORDER BY table3.nome) OVER (PARTITION BY table1.id) as "bairro"
    FROM table1
    LEFT JOIN table2 on table2.escola = table1.id
    LEFT JOIN table3 on table3.id = table2.bairro
    WHERE table1.situacao = 'EM_ATIVIDADE'
    ORDER BY table1.id
    

    有关示例,请参阅Oracle docs

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-10-09
      • 2016-08-31
      • 2018-12-14
      • 1970-01-01
      • 2020-05-04
      • 1970-01-01
      • 1970-01-01
      • 2021-09-12
      相关资源
      最近更新 更多