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

क्वेरी बनाना जो दो तालिकाओं से पंक्तियों में स्थिति से मेल खाने पर आईडी लौटाता है

पढ़ चुके हैं क्योंकि-की-एक-गलत व्याख्या">आपका प्रश्न इस विशेष प्रश्न के बारे में मेटा पर, मैं समझाता हूं कि तीनों उत्तर वास्तव में सही क्यों हैं - जिस तरह से आपने इसे हल किया।

मैंने तीनों उत्तरों के उदाहरण और उस स्कीमा को शामिल किया है जिस पर वे काम कर रहे हैं:

Database changed
mysql> create table carpet(id int(3), material varchar(10), color varchar(15));
Query OK, 0 rows affected (0.02 sec)

mysql> create table curtain(id int(3), material varchar(10), color varchar(15));
Query OK, 0 rows affected (0.00 sec)

(इन्सर्ट स्टेटमेंट्स का गुच्छा)

mysql> select * from carpet;
+------+-----------+--------------+
| id   | material  | color        |
+------+-----------+--------------+
|    1 | wool      | Light Yellow |
|    2 | wool      | Beige        |
|    3 | polyester | Light Yellow |
|    4 | polyester | Light Red    |
+------+-----------+--------------+
4 rows in set (0.00 sec)

mysql> select * from curtain;
+------+----------+--------------+
| id   | material | color        |
+------+----------+--------------+
|    1 | Velvet   | Purple       |
|    2 | cotton   | White        |
|    3 | cotton   | Light Yellow |
|    4 | cotton   | Light Blue   |
+------+----------+--------------+
4 rows in set (0.00 sec)

एक प्रतिच्छेदन दो चुनिंदा कथनों का उपयोग करता है और मिलान परिणामों को वापस लाता है। इस मामले में, आप उन सभी पंक्तियों की तलाश कर रहे हैं जिनका रंग 'हल्का पीला' से मेल खाता है।

मैं आपको MySQL में एक उदाहरण नहीं दे सकता क्योंकि यह इसका समर्थन नहीं करता है (जैसा कि आप नीचे देख सकते हैं, समान परिणाम देने की आवश्यकता नहीं है)।

दो चुनिंदा बयानों की एक यूनियन क्वेरी, जहां एक क्लॉज केवल 'लाइट येलो' के रंग की अनुमति देता है, वही डेटा लौटाएगा। हालांकि एक संघ का उपयोग उस डेटा को वापस करने के लिए किया जा सकता है जो मेल नहीं खाता है, जहां प्रत्येक चयन कथन में क्लॉज का अर्थ है कि यह केवल वही पंक्तियां लौटाएगा जो आप चाहते हैं।

mysql> select id, material, color from carpet
    -> union 
    -> select id, material, color from curtain;
+------+-----------+--------------+
| id   | material  | color        |
+------+-----------+--------------+
|    1 | wool      | Light Yellow |
|    2 | wool      | Beige        |
|    3 | polyester | Light Yellow |
|    4 | polyester | Light Red    |
|    1 | Velvet    | Purple       |
|    2 | cotton    | White        |
|    3 | cotton    | Light Yellow |
|    4 | cotton    | Light Blue   |
+------+-----------+--------------+
8 rows in set (0.00 sec)

ओह, यह बुरा है ना? बेशक, हमने कहां क्लॉज निर्दिष्ट नहीं किया:

mysql> select id, material, color from carpet where color='Light Yellow'
    -> union
    -> select id, material, color from curtain where color='Light Yellow';
+------+-----------+--------------+
| id   | material  | color        |
+------+-----------+--------------+
|    1 | wool      | Light Yellow |
|    3 | polyester | Light Yellow |
|    3 | cotton    | Light Yellow |
+------+-----------+--------------+
3 rows in set (0.00 sec)

रंग पर दो तालिकाओं के बीच एक जुड़ाव आपको डेटा की एक पंक्ति में दोनों तालिकाओं से पंक्तियों को वापस करने की अनुमति देगा। आप आइटम के रंग के लिए दो तालिकाओं पर शामिल होने को निर्दिष्ट कर सकते हैं, और जहां क्लॉज का उपयोग केवल उन पंक्तियों को वापस करने के लिए कर सकते हैं जिन्हें आप ढूंढ रहे हैं।

mysql> select a.id, a.material, a.color, b.id, b.material 
    -> from curtain a join carpet b on a.color=b.color;
+------+----------+--------------+------+-----------+
| id   | material | color        | id   | material  |
+------+----------+--------------+------+-----------+
|    3 | cotton   | Light Yellow |    1 | wool      |
|    3 | cotton   | Light Yellow |    3 | polyester |
+------+----------+--------------+------+-----------+
2 rows in set (0.00 sec)

जैसा कि आप देख सकते हैं, इसने केवल मिलान रंग वाली पंक्तियों को लौटाया है और आपको अपने परिणामसेट की एक पंक्ति में दोनों तालिकाओं से कॉलम रखने की अनुमति दी है।

अब, मैंने स्पष्ट रूप से इसकी बहुत अच्छी तरह से योजना नहीं बनाई थी क्योंकि मेरे पास दोनों तालिकाओं में 'हल्के पीले' के अलावा कोई अन्य मिलान परिणाम नहीं है, इसलिए यदि मैं इसमें कुछ और प्रविष्टियाँ जोड़ता हूँ तो हमें यह मिलता है:

mysql> select * from curtain;
+------+----------+--------------+
| id   | material | color        |
+------+----------+--------------+
|    1 | Velvet   | Purple       |
|    2 | cotton   | White        |
|    3 | cotton   | Light Yellow |
|    4 | cotton   | Light Blue   |
|    5 | Wool     | White        |
|    6 | Fluff    | Beige        |
+------+----------+--------------+
6 rows in set (0.00 sec)

mysql> select * from carpet;
+------+-----------+--------------+
| id   | material  | color        |
+------+-----------+--------------+
|    1 | wool      | Light Yellow |
|    2 | wool      | Beige        |
|    3 | polyester | Light Yellow |
|    4 | polyester | Light Red    |
|    5 | Fluff     | Light Blue   |
+------+-----------+--------------+
5 rows in set (0.00 sec)

अब हम इसे फिर से चला सकते हैं, और इस बार प्राप्त कर सकते हैं:

mysql> select a.id, a.material, a.color, b.id, b.material 
    -> from curtain a join carpet b on a.color=b.color;
+------+----------+--------------+------+-----------+
| id   | material | color        | id   | material  |
+------+----------+--------------+------+-----------+
|    3 | cotton   | Light Yellow |    1 | wool      |
|    3 | cotton   | Light Yellow |    3 | polyester |
|    4 | cotton   | Light Blue   |    5 | Fluff     |
|    6 | Fluff    | Beige        |    2 | wool      |
+------+----------+--------------+------+-----------+
4 rows in set (0.00 sec)

अरे नहीं!

यह अब वह जगह है जहां हम शामिल हों और जहां क्लॉज एक साथ उपयोग करते हैं:

mysql> select a.id, a.material, a.color, b.id, b.material 
    -> from curtain a join carpet b on a.color=b.color 
    -> where a.color='Light Yellow';
+------+----------+--------------+------+-----------+
| id   | material | color        | id   | material  |
+------+----------+--------------+------+-----------+
|    3 | cotton   | Light Yellow |    1 | wool      |
|    3 | cotton   | Light Yellow |    3 | polyester |
+------+----------+--------------+------+-----------+
2 rows in set (0.00 sec)

आप देखते हैं, SQL में आपकी तालिकाओं में एक ही डेटा की विविधताओं की तुलना में अलग-अलग माध्यमों से एक ही परिणाम प्राप्त करने के लिए अक्सर अधिक तरीके होते हैं।

संपादित करें:ठीक है, इसलिए यदि आप केवल उन पंक्तियों को चाहते हैं जहां सभी डेटा मेल खाता है, बस इसे शामिल सिंटैक्स में शामिल करें:

mysql> select a.id, a.material, a.color, b.id, b.material 
    -> from curtain a 
    -> join carpet b on a.color=b.color
    -> and a.id=b.id
    -> where a.color='Light Yellow';
+------+----------+--------------+------+-----------+
| id   | material | color        | id   | material  |
+------+----------+--------------+------+-----------+
|    3 | cotton   | Light Yellow |    3 | polyester |
+------+----------+--------------+------+-----------+
1 row in set (0.00 sec)

जैसा कि आप देख सकते हैं, अब हम ज्वाइन को बताते हैं कि दोनों id और color फ़ील्ड दो तालिकाओं के बीच मेल खाना चाहिए - और परिणाम स्वयं के लिए बोलते हैं। अब, इस मामले में, मैं तकनीकी रूप से अभी भी सभी कॉलम से मेल नहीं खाता क्योंकि सामग्री अलग है। यदि आप आगे मिलान करना चाहते हैं, तो क्वेरी कोई परिणाम नहीं लौटाएगी क्योंकि मेरे पास कोई मिलान रिकॉर्ड नहीं है जहां आईडी, सामग्री और रंग मेल खाते हैं, लेकिन सिंटैक्स निम्नानुसार होगा:

mysql> select a.id, a.material, a.color, b.id, b.material 
    -> from curtain a 
    -> join carpet b on a.color=b.color
    -> and a.id=b.id
    -> and a.material=b.material
    -> where a.color='Light Yellow';
Empty set (0.00 sec)

उस नोट पर हालांकि, आप ज्यादातर मामलों में, आप सभी . नहीं चाहते हैं मिलान करने के लिए कॉलम। बहुत बार तालिकाओं में एक आईडी होती है जिसका उपयोग केवल उस तालिका के लिए किया जाता है और यह स्वचालित रूप से वृद्धिशील मान होता है। आप इसका उपयोग कि . में एक अद्वितीय पंक्ति की पहचान करने के लिए करना चाहते हैं तालिका, लेकिन असंबंधित तालिकाओं से मेल खाने के लिए इसका उपयोग नहीं करना। अगर कुछ भी हो, तो मैंने सुझाव दिया होगा कि आप सामग्री और रंग से मेल खाते हैं - लेकिन उसमें से आईडी छोड़ दें।



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. अजगर psycopg2 जाँच पंक्ति मौजूद है

  2. PostgreSQL part2 में एक एन्यूमरेशन कॉलम के आधार पर सभी पंक्तियों का योग कैसे करें?

  3. MySQL बनाम PostgreSQL? मुझे अपने Django प्रोजेक्ट के लिए किसे चुनना चाहिए?

  4. पोस्टग्रेज JSON डेटा प्रकार रेल क्वेरी

  5. PostgreSQL में परिणाम सेट का वर्णन करें?