Oracle выбирает отдельные дубликаты слияния [дубликат]

Dec 01 2020

У меня есть простая таблица в моей базе данных, которая выглядит так

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

Как видите, данные не самые лучшие и есть повторяющиеся категории с разными category_id. Моя цель - получить результат, в котором каждая категория встречается один раз, и если есть несколько идентификаторов для одного и того же имени категории, объедините их (через запятую или что-то вроде этого). Итак, для примера результат должен выглядеть так

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

Как я могу заархивировать этот результат. Мой текущий запрос выглядит так

select distinct category, category_id 
from my_table
order by 1;

Я совершенно не знаю, как заархивировать такое слияние с отдельным заявлением. Правильный ли подход - это четкое изложение или мне следует использовать другое?

Ответы

2 ThorstenKettner Dec 01 2020 at 16:13

Ты прав; идентификатор категории должен представлять категорию, поэтому такая таблица не должна содержать одну и ту же категорию дважды (с двумя разными идентификаторами). В таблице отсутствует уникальное ограничение на категорию.

Вы хотите, чтобы данные представлялись по-другому, чего можно добиться с помощью агрегирования:

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

Использовать group byи listaggнравится

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

увидеть скрипку