PostgreSQL में, EXCEPT
ऑपरेटर उन पंक्तियों को लौटाता है जो बाईं इनपुट क्वेरी द्वारा लौटाई जाती हैं जो सही इनपुट क्वेरी द्वारा वापस नहीं की जाती हैं। इसे अंतर . के रूप में भी संदर्भित किया जा सकता है दो प्रश्नों के बीच।
सिंटैक्स
वाक्य रचना इस प्रकार है:
query1 EXCEPT [ALL] query2
जब तक EXCEPT ALL
. डुप्लीकेट हटा दिए जाते हैं उपयोग किया जाता है।
उदाहरण
मान लीजिए कि हमारे पास निम्नलिखित टेबल हैं:
SELECT * FROM Teachers;
SELECT * FROM Students;
परिणाम:
teacherid | teachername -----------+------------- 1 | Warren 2 | Ben 3 | Cathy 4 | Cathy 5 | Bill 6 | Bill studentid | studentname -----------+------------- 1 | Faye 2 | Jet 3 | Spike 4 | Ein 5 | Warren 6 | Bill
हम EXCEPT
. का उपयोग कर सकते हैं जो शिक्षक भी छात्र नहीं हैं, उन्हें लौटाने के लिए ऑपरेटर:
SELECT TeacherName FROM Teachers
EXCEPT
SELECT StudentName FROM Students;
परिणाम:
teachername ------------- Cathy Ben
इसलिए हमें केवल वही मान मिलते हैं जो Teachers
. में दिखाई देते हैं तालिका जो Students
. में भी दिखाई नहीं देती है टेबल।
डिफ़ॉल्ट रूप से, EXCEPT
ऑपरेटर अलग पंक्तियों देता है। तो हमारे उदाहरण में, Cathy
. के लिए केवल एक पंक्ति लौटाई जाती है , भले ही उस नाम के दो शिक्षक हों।
उपरोक्त उदाहरण निम्न क्वेरी के बराबर है:
SELECT TeacherName FROM Teachers
EXCEPT DISTINCT
SELECT StudentName FROM Students;
परिणाम:
teachername ------------- Cathy Ben
यह वही परिणाम है जो हमें तब मिला जब कोई स्पष्ट DISTINCT
. नहीं था खोजशब्द। हम ALL
. के साथ डुप्लीकेट शामिल कर सकते हैं कीवर्ड (इस पर बाद में)।
बाईं ओर कौन सी तालिका है और कौन सी दाईं ओर है, इसके आधार पर हम अलग-अलग परिणाम प्राप्त कर सकते हैं। यहां एक उदाहरण दिया गया है जो Students
को रखता है बाईं ओर तालिका और Teachers
दाईं ओर:
SELECT StudentName FROM Students
EXCEPT
SELECT TeacherName FROM Teachers;
परिणाम:
studentname ------------- Faye Jet Spike Ein
इस बार हमें ऐसे छात्र मिले जो शिक्षक भी नहीं हैं।
डुप्लिकेट शामिल करें
डिफ़ॉल्ट रूप से, EXCEPT
ऑपरेटर परोक्ष रूप से एक DISTINCT
लागू करता है कार्यवाही। दूसरे शब्दों में, यह डिफ़ॉल्ट रूप से केवल विशिष्ट मान देता है।
हम ALL
. शामिल कर सकते हैं हमारे परिणाम में डुप्लीकेट शामिल करने के लिए कीवर्ड:
SELECT TeacherName FROM Teachers
EXCEPT ALL
SELECT StudentName FROM Students;
परिणाम:
teachername ------------- Cathy Cathy Bill Ben
इस बार हमें अपने पहले उदाहरण में मिली दो पंक्तियों के बजाय चार पंक्तियाँ मिलीं।
हम देख सकते हैं कि हमारे पहले उदाहरण में दोनों कैथियों को केवल एक की तरह लौटाया गया था।
बिल के लिए के रूप में? Teachers
. में दो विधेयक हैं तालिका, लेकिन यहां केवल एक ही लौटाया जाता है। ऐसा शायद इसलिए है क्योंकि Students
. में एक बिल है तालिका, जो हमारे परिणामों में से एक बिल को बाहर कर देगी।
एक वैकल्पिक
EXCEPT
. का उपयोग किए बिना समान परिणाम प्राप्त करना संभव है ऑपरेटर। उदाहरण के लिए, हम इसके लिए अपना पहला उदाहरण फिर से लिख सकते हैं:
SELECT
DISTINCT TeacherName
FROM Teachers t
WHERE NOT EXISTS (SELECT StudentName FROM Students s
WHERE t.TeacherName = s.StudentName);
परिणाम:
teachername ------------- Cathy Ben