Oracleは、個別のマージ重複を選択します[重複]

Dec 01 2020

データベースに次のような単純なテーブルがあります

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

ご覧のとおり、データは最適ではなく、category_idsが異なる重複カテゴリがあります。私の目標は、各カテゴリが1回発生し、同じカテゴリ名に複数の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

あなたが正しいです; カテゴリIDはカテゴリを表す必要があるため、そのようなテーブルに同じカテゴリが2回含まれることはありません(2つの異なるIDを持つ)。このテーブルには、カテゴリに対する一意の制約がありません。

異なる方法で表されたデータを確認する必要があります。これは、集計を使用して実現できます。

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

フィドルを参照してください