Oracle seleciona duplicatas de mesclagem distintas [duplicata]

Dec 01 2020

Eu tenho uma tabela simples em meu banco de dados que se parece com esta

+----------+-------------+
| category | category_id |
+----------+-------------+
| cars     |           1 |
| bikes    |           2 |
| planes   |           3 |
| bikes    |           4 |
| cars     |           5 |
+----------+-------------+

Como você pode ver, os dados não são os melhores e existem categorias duplicadas com diferentes category_ids. Meu objetivo é obter um resultado em que cada categoria ocorra uma vez e, se houver vários ids para o mesmo nome de categoria, mescle-os (separados por vírgula ou sth. Assim). Portanto, para o exemplo, o resultado deve ser semelhante a este

+----------+-------------+
| category | category_id |
+----------+-------------+
| cars     |         1,5 |
| bikes    |         2,4 |
| planes   |           3 |
+----------+-------------+

Como posso arquivar esse resultado. Minha consulta atual se parece com isto

select distinct category, category_id 
from my_table
order by 1;

Não tenho absolutamente nenhuma ideia de como arquivar esse tipo de mesclagem com uma declaração distinta. A declaração distinta é a abordagem certa ou devo usar outra?

Respostas

2 ThorstenKettner Dec 01 2020 at 16:13

Você está certo; um ID de categoria deve representar uma categoria, portanto, tal tabela não deve conter a mesma categoria duas vezes (com dois IDs diferentes). A tabela carece de uma restrição única na categoria.

Você deseja ver os dados representados de maneira diferente, o que pode ser obtido com a agregação:

select
  category,
  listagg(category_id, ', ') within group (order by category_id) as category_ids
from my_table
group by category
order by category;
1 Dornaut Dec 01 2020 at 16:13

Use group bye listaggcurta

select category, listagg(category_id, ',') category_id
from my_table
group by category

ver violino