Oracle wybiera odrębne scalanie duplikatów [duplikat]

Dec 01 2020

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

2 ThorstenKettner Dec 01 2020 at 16:13

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;
1 Dornaut Dec 01 2020 at 16:13

Użyj group byi listaggpolub

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

zobacz skrzypce