PostgreSQL
 sql >> डेटाबेस >  >> RDS >> PostgreSQL

क्या पोस्टग्रेएसक्यूएल में यूनियन के बाद ऑर्डर संरक्षित है?

मूल रूप से, आपकी क्वेरी शुरू करने के लिए गलत है। 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 ट्रेल्स को अलग बताने के उद्देश्य से। लेकिन आपको अपने स्वयं के कॉलम का उपयोग करना चाहिए। (बेला में जोड़ा गया उदाहरण।)

विचार करें:



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. मैं एक अद्यतन क्वेरी में पोस्टग्रेज़ डेटाबेस में किसी फ़ील्ड से सभी रिक्त स्थान कैसे हटा सकता हूं?

  2. INSERT ... ON CONFLICT (id) DO UPDATE... सिंटैक्स का उपयोग अनुक्रम आईडी के साथ कैसे किया जा सकता है?

  3. डेटाटाइप बाइटिया क्या है और मैं इसका उपयोग कब करूंगा?

  4. तालिका में अद्वितीय संयोजन

  5. सी # एनम को पोस्टग्रेज करने के लिए एनम