Oracle wybiera odrębne scalanie duplikatów [duplikat]
Mam w swojej bazie danych prostą tabelę, która wygląda następująco
+----------+-------------+
| category | category_id |
+----------+-------------+
| cars | 1 |
| bikes | 2 |
| planes | 3 |
| bikes | 4 |
| cars | 5 |
+----------+-------------+
Jak widać, dane nie są najlepsze i istnieją zduplikowane kategorie z różnymi identyfikatorami kategorii. Moim celem jest uzyskanie wyniku, w którym każda kategoria występuje jeden raz i jeśli istnieje wiele identyfikatorów dla tej samej nazwy kategorii, połącz je (oddzielone przecinkami lub coś w ten sposób). Na przykład wynik powinien wyglądać tak
+----------+-------------+
| category | category_id |
+----------+-------------+
| cars | 1,5 |
| bikes | 2,4 |
| planes | 3 |
+----------+-------------+
Jak mogę zarchiwizować ten wynik. Moje aktualne zapytanie wygląda następująco
select distinct category, category_id
from my_table
order by 1;
Nie mam absolutnie pojęcia, jak zarchiwizować tego rodzaju scalanie za pomocą odrębnej instrukcji. Czy odrębne stwierdzenie jest właściwym podejściem, czy powinienem użyć innego?
Odpowiedzi
Masz rację; identyfikator kategorii powinien reprezentować kategorię, więc taka tabela nie powinna zawierać dwukrotnie tej samej kategorii (z dwoma różnymi identyfikatorami). W tabeli brakuje unikalnego ograniczenia kategorii.
Chcesz, aby dane były prezentowane w inny sposób, co możesz osiągnąć dzięki agregacji:
select
category,
listagg(category_id, ', ') within group (order by category_id) as category_ids
from my_table
group by category
order by category;
Użyj group by
i listagg
polub
select category, listagg(category_id, ',') category_id
from my_table
group by category
zobacz skrzypce