Я думаю, это потому, что вы используете функцию агрегирования, которая возвращает одну строку вместе со столбцами, которые будут возвращать несколько строк.Поэтому вам нужно либо сгруппировать каждый «нормальный» столбец в предложении 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 документы для некоторых примеров.