ओरेकल विशिष्ट मर्ज डुप्लिकेट का चयन करें [डुप्लिकेट]

Dec 01 2020

मेरे डेटाबेस में एक सरल तालिका है जो इस तरह दिखती है

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

जैसा कि आप देख सकते हैं कि डेटा सबसे अच्छा नहीं है और अलग-अलग श्रेणी_ के साथ डुप्लिकेट श्रेणियां हैं। मेरा लक्ष्य एक परिणाम प्राप्त करना है जहां प्रत्येक श्रेणी एक बार होती है और यदि एक ही श्रेणी के नाम के लिए कई आईडी हैं तो उन्हें मर्ज करें (अल्पविराम से अलग या sth। उस तरह)। उदाहरण के लिए, परिणाम इस तरह दिखना चाहिए

+----------+-------------+
| 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

बेला देखना