SQL सर्वर में, ALL
सबक्वेरी द्वारा लौटाए गए मानों के एकल-स्तंभ सेट के साथ स्केलर मान की तुलना करने के लिए ऑपरेटर का उपयोग सबक्वेरी के साथ किया जा सकता है।
यह भी सच है कि SELECT
खंड और UNION
ऑपरेटर दोनों एक ALL
स्वीकार करते हैं तर्क, हालांकि इस उपयोग का एक अलग उद्देश्य है (परिणाम सेट में डुप्लिकेट की अनुमति देता है)।
नीचे ALL
. का उपयोग करने के उदाहरण दिए गए हैं सबक्वेरी वाला ऑपरेटर।
उदाहरण
मान लें कि हमारे पास दो टेबल हैं; Cats
और Dogs
Cats
+---------+-----------+ | CatId | CatName | |---------+-----------| | 1 | Meow | | 2 | Fluffy | | 3 | Scratch | +---------+-----------+
Dogs
+---------+-----------+ | DogId | DogName | |---------+-----------| | 1 | Fetch | | 2 | Fluffy | | 3 | Wag | +---------+-----------+
अब ALL
. का उपयोग करके एक सबक्वेरी चलाते हैं ऑपरेटर।
SELECT
CatId,
CatName
FROM Cats c
WHERE c.CatName = ALL (SELECT DogName FROM Dogs);
परिणाम:
(0 rows affected)
इस मामले में, कोई पंक्तियाँ वापस नहीं की गईं। ऐसा इसलिए है क्योंकि ALL
प्रत्येक . से सकारात्मक रूप से तुलना करने के लिए अदिश व्यंजक की आवश्यकता होती है वह मान जो सबक्वेरी द्वारा लौटाया जाता है।
इस मामले में, सबक्वेरी इतनी व्यापक थी कि Dogs
. से सभी पंक्तियाँ तालिका वापस कर दी गई। इसके लिए यह आवश्यक होगा कि प्रत्येक कुत्ते के पास समान नाम वाली कम से कम एक संगत बिल्ली हो।
आइए सबक्वेरी को थोड़ा बदल दें।
SELECT
CatId,
CatName
FROM Cats c
WHERE c.CatName = ALL (
SELECT DogName FROM Dogs
WHERE DogId = 2
);
परिणाम:
+---------+-----------+ | CatId | CatName | |---------+-----------| | 2 | Fluffy | +---------+-----------+
इस मामले में मुझे सकारात्मक परिणाम मिलता है, क्योंकि सबक्वायरी द्वारा लौटाई गई सभी पंक्तियों में Cats
में एक समान पंक्ति थी तालिका (यद्यपि केवल एक पंक्ति)।
विपरीत वापसी
हम ALL
. के साथ किसी भी तुलना ऑपरेटर का उपयोग कर सकते हैं . इसलिए हम पिछले उदाहरणों को संशोधित कर विपरीत परिणाम लौटा सकते हैं, बस बराबर ऑपरेटर (=) को नॉट बराबर ऑपरेटर (या तो <>
) में बदलकर या गैर आईएसओ मानक !=
)।
SELECT
CatId,
CatName
FROM Cats c
WHERE c.CatName <> ALL (SELECT DogName FROM Dogs);
परिणाम:
+---------+-----------+ | CatId | CatName | |---------+-----------| | 1 | Meow | | 3 | Scratch | +---------+-----------+
इसलिए उन सभी पंक्तियों को वापस करने के बजाय जिनकी उपश्रेणी में संबंधित पंक्ति है, हम उन सभी पंक्तियों को वापस कर देते हैं जो नहीं हैं एक समान पंक्ति है।
और हम दूसरे उदाहरण के साथ भी ऐसा ही कर सकते हैं।
SELECT
CatId,
CatName
FROM Cats c
WHERE c.CatName <> ALL (
SELECT DogName FROM Dogs
WHERE DogId = 2
);
परिणाम:
+---------+-----------+ | CatId | CatName | |---------+-----------| | 1 | Meow | | 3 | Scratch | +---------+-----------+
त्रुटि 116?
यदि आपको ALL
. का उपयोग करते समय त्रुटि 116 मिलती है , ऐसा शायद इसलिए है क्योंकि आप अपनी सबक्वेरी में एकाधिक कॉलम का चयन कर रहे हैं। ALL
ऑपरेटर का उपयोग केवल उन सबक्वेरी के साथ किया जा सकता है जिनमें एक कॉलम का परिणाम सेट होता है।
हम इस त्रुटि का कारण कैसे बन सकते हैं, इसका एक उदाहरण यहां दिया गया है।
SELECT
CatId,
CatName
FROM Cats c
WHERE c.CatName = ALL (SELECT DogId, DogName FROM Dogs);
मैंने सबक्वायरी में बस एक कॉलम जोड़ा है।
सबक्वेरी में सभी कॉलम चुनने के लिए वाइल्डकार्ड ऑपरेटर का उपयोग करते समय यह एक सामान्य त्रुटि है।
SELECT
CatId,
CatName
FROM Cats c
WHERE c.CatName = ALL (SELECT * FROM Dogs);
किसी भी तरह से, परिणाम समान है:
Msg 116, Level 16, State 1, Line 5 Only one expression can be specified in the select list when the subquery is not introduced with EXISTS.