मेरे पास id के साथ एक टेबल है, अब हमने एक नया फ़ील्ड जोड़ा है जहां हमने बाहरी स्रोत से अद्वितीय गणना की है, जिससे हमें एहसास हुआ कि हमारे पास वास्तव में डेटाबेस में डुप्लीकेट हैं:

मुख्य तालिका

id | unique_id | ...
---|------------
4  | A         |
5  | A
6  | B

हम देख सकते हैं: 5 वास्तव में 4 का डुप्लिकेट है, क्योंकि उन दोनों में समान unique_id है।

अब इसे साफ करने की जरूरत है।

दुख की बात है कि मैं केवल उन डुप्लिकेट्स (5) को नहीं हटा सकता, क्योंकि अन्य टेबल इस पर निर्भर करती हैं:

अन्य तालिका (OtherTable.main_id REFERENCES MainTable.id)

id | main_id | ...
---|------------
1  | 4       | Blah
2  | 5
3  | 6

अब मुझे डुप्लीकेट साफ़ करना है, यहाँ

UPDATE OtherTable SET main_id = 5 WHERE main_id=4

मैं इसे एक कुशल अद्यतन में कैसे कर सकता हूं? मैंने पहले वाले के हर संदर्भ को उसी unique_id के साथ अपडेट करने की कोशिश की, हालांकि यह एक दिन में पूरा नहीं हुआ।

UPDATE "OtherTable" SET "main_id" = (SELECT "id" FROM "MainTable" WHERE "unique_id" = (SELECT "unique_id" FROM "MainTable" WHERE "id" == "OtherTable"."main_id") LIMIT 1)

यदि यह मदद करता है, तो MainTable में लगभग 750,000 प्रविष्टियाँ हैं, OtherTable में 12,000,000 पंक्तियाँ हैं।

शायद ऐसा इसलिए है क्योंकि वे ट्रिपल सिलेक्ट वन काफी अक्षम हैं।

डुप्लिकेट को हटाने के सरल भाग के लिए (जब मैं अपनी तरह के पहले के संदर्भों को बदलने के साथ किया जाएगा) मुझे यह क्वेरी तेजी से पर्याप्त रूप से काम करने के लिए मिली:

DELETE FROM MainTable
    WHERE id IN
        (SELECT id
        FROM
            (SELECT id,
             ROW_NUMBER() OVER( PARTITION BY unique_id
            ORDER BY  id ) AS row_num
            FROM MainTable ) t
            WHERE t.row_num > 1 );

हालांकि मुझे डुप्लिकेट के गैर-हटाए गए लोगों के संदर्भों को अद्यतन करने का एक तरीका चाहिए।

0
luckydonald 13 सितंबर 2020, 19:44

1 उत्तर

सबसे बढ़िया उत्तर

नेस्टेड क्वेरी के साथ UPDATE के बजाय, मैं का उपयोग करने का सुझाव दूंगा शामिल होने के लिए UPDATE FROM, और आपके DELETE कथन की तरह ही विंडो कार्य करता है:

UPDATE "OtherTable" AS other
SET main_id = main.min_id
FROM (SELECT
    id,
    first_value(id) OVER (PARTITION BY unique_id ORDER BY id) AS min_id
  FROM "MainTable"
) AS main
WHERE main.id = other.main_id
  AND main.id <> main.min_id
0
luckydonald 13 सितंबर 2020, 21:54