मूल रूप से, आपकी क्वेरी शुरू करने के लिए गलत है। UNION ALL
का प्रयोग करें , नहीं <स्ट्राइक>UNION
स्ट्राइक> या आप गलत तरीके से डुप्लिकेट प्रविष्टियों को हटा देंगे। (यह कहने के लिए कुछ भी नहीं है कि निशान एक ही ईमेल के बीच आगे-पीछे नहीं हो सकता।)
UNION ALL
. के लिए पोस्टग्रेज़ कार्यान्वयन अनुक्रम में मूल्यों को संलग्न के रूप में लौटाता है - जब तक आप नहीं करते हैं ORDER BY
. जोड़ें अंत में या परिणाम के साथ कुछ और करें।
हालांकि जागरूक रहें, कि प्रत्येक SELECT
पंक्तियों को मनमाने क्रम में तब तक लौटाता है जब तक कि ORDER BY
. न हो संलग्न है। तालिकाओं में कोई प्राकृतिक क्रम नहीं है।
वही नहीं है UNION
. के लिए सही है , जिसे संभावित डुप्लिकेट को हटाने के लिए सभी पंक्तियों को संसाधित करना है। डुप्लीकेट निर्धारित करने के कई तरीके हैं, पंक्तियों का परिणामी क्रम चुने हुए एल्गोरिदम पर निर्भर करता है और कार्यान्वयन-निर्भर और पूरी तरह से अविश्वसनीय है - जब तक, फिर से, ORDER BY
संलग्न है।
तो इसके बजाय उपयोग करें:
SELECT * FROM iter1
UNION ALL -- union all!
SELECT * FROM iter2;
एक विश्वसनीय सॉर्ट ऑर्डर प्राप्त करने के लिए, और "विकास के रिकॉर्ड का अनुकरण" करने के लिए, आप इस तरह के स्तरों को ट्रैक कर सकते हैं:
WITH RECURSIVE all_emails AS (
SELECT *, 1 AS lvl
FROM audit_trail
WHERE old_email = '[email protected]'
UNION ALL -- union all!
SELECT t.*, a.lvl + 1
FROM all_emails a
JOIN audit_trail t ON t.old_email = a.new_email
)
TABLE all_emails
ORDER BY lvl;
db<>fiddle यहां
पुराना sqlfiddle
उप>
इसके अलावा:अगर old_email
परिभाषित नहीं है UNIQUE
किसी तरह, आप कई ट्रेल्स प्राप्त कर सकते हैं। इसे स्पष्ट रखने के लिए आपको एक अद्वितीय स्तंभ (या स्तंभों का संयोजन) की आवश्यकता होगी। यदि अन्य सभी विफल हो जाते हैं तो आप (ab-)आंतरिक टपल आईडी का उपयोग कर सकते हैं ctid
ट्रेल्स को अलग बताने के उद्देश्य से। लेकिन आपको अपने स्वयं के कॉलम का उपयोग करना चाहिए। (बेला में जोड़ा गया उदाहरण।)
विचार करें: