मात्र डुप्लिकेट निष्कासन कार्यक्षमता बिंदु से क्या अंतर है
इस तथ्य के अलावा कि इसके विपरीत DISTINCT
, प्रति समूहGROUP BY
डेटा एकत्र करने की अनुमति देता है (जिसका उल्लेख कई अन्य उत्तरों द्वारा किया गया है), मेरी राय में सबसे महत्वपूर्ण अंतर तथ्य यह है कि दो ऑपरेशन "होते हैं" तार्किक क्रम में दो बहुत अलग चरणों में होते हैं एक बयान में निष्पादित किए जाने वाले कार्यों का संचालन ।SELECT
यहां सबसे महत्वपूर्ण ऑपरेशन हैं:
FROM
(सहित JOIN
, APPLY
आदि)
WHERE
GROUP BY
(डुप्लिकेट निकाल सकते हैं)
- एकत्रीकरण
HAVING
- विंडो फ़ंक्शन
SELECT
DISTINCT
(डुप्लिकेट निकाल सकते हैं)
UNION
, INTERSECT
, EXCEPT
(डुप्लिकेट निकाल सकते हैं)
ORDER BY
OFFSET
LIMIT
जैसा कि आप देख सकते हैं, प्रत्येक ऑपरेशन का तार्किक क्रम प्रभावित करता है कि इसके साथ क्या किया जा सकता है और बाद के कार्यों को कैसे प्रभावित करता है। विशेष रूप से, यह तथ्य कि GROUP BY
ऑपरेशन "SELECT
(प्रक्षेपण) से पहले" होता है " का अर्थ है:
- यह प्रक्षेपण पर निर्भर नहीं करता है (जो एक फायदा हो सकता है)
- यह प्रक्षेपण से किसी भी मान का उपयोग नहीं कर सकता है (जो नुकसान हो सकता है)
1. यह प्रक्षेपण पर निर्भर नहीं करता है
एक उदाहरण जहां प्रक्षेपण पर निर्भर नहीं करना उपयोगी है यदि आप अलग-अलग मूल्यों पर विंडो फ़ंक्शन की गणना करना चाहते हैं:
SELECT rating, row_number() OVER (ORDER BY rating) AS rn
FROM film
GROUP BY rating
जब सकिला डेटाबेस के खिलाफ चलाया जाता है , तो यह पैदावार होती है:
rating rn
-----------
G 1
NC-17 2
PG 3
PG-13 4
R 5
उसी को DISTINCT
आसानी से हासिल नहीं किया जा सकता है:
SELECT DISTINCT rating, row_number() OVER (ORDER BY rating) AS rn
FROM film
वह प्रश्न "गलत" है और कुछ इस तरह देता है:
rating rn
------------
G 1
G 2
G 3
...
G 178
NC-17 179
NC-17 180
...
यह वह नहीं है जो हम चाहते थे। DISTINCT
आपरेशन "के बाद क्या होता" तो हम नहीं रह गया है हटा सकते हैं, प्रक्षेपण DISTINCT
रेटिंग खिड़की समारोह पहले से ही गणना की और पेश किया गया था क्योंकि। उपयोग करने के लिए DISTINCT
, हमें क्वेरी के उस हिस्से को घोंसला बनाना होगा:
SELECT rating, row_number() OVER (ORDER BY rating) AS rn
FROM (
SELECT DISTINCT rating FROM film
) f
साइड-नोट: इस विशेष मामले में, हम भी उपयोग कर सकते हैंDENSE_RANK()
SELECT DISTINCT rating, dense_rank() OVER (ORDER BY rating) AS rn
FROM film
2. यह प्रक्षेपण से किसी भी मान का उपयोग नहीं कर सकता है
SQL की कमियों में से एक समय में इसकी वाचालता है। उसी कारण के लिए जैसा हमने पहले देखा है (अर्थात् तार्किक संचालन का क्रम), हम उस चीज़ को "आसानी से" समूह में नहीं कर सकते हैं जिसे हम प्रोजेक्ट कर रहे हैं।
यह अमान्य SQL है:
SELECT first_name || ' ' || last_name AS name
FROM customer
GROUP BY name
यह मान्य है (अभिव्यक्ति को दोहराते हुए)
SELECT first_name || ' ' || last_name AS name
FROM customer
GROUP BY first_name || ' ' || last_name
यह मान्य है, भी (अभिव्यक्ति का नामकरण)
SELECT name
FROM (
SELECT first_name || ' ' || last_name AS name
FROM customer
) c
GROUP BY name
मैंने इस विषय के बारे में एक ब्लॉग पोस्ट में अधिक गहराई से लिखा है