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

SQL सर्वर सभी ऑपरेटर समझाया गया

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.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. SQL सर्वर डेटाबेस में उपयोगकर्ता-परिभाषित तालिकाओं की संख्या की गणना करने के 5 तरीके

  2. SQL सर्वर 2017 में संबंध बनाएं

  3. डिज़ाइन द्वारा शून्य SQL गतिरोध - कोई कोडिंग पैटर्न?

  4. SQL सर्वर क्या है?

  5. पेजिंग को लागू करने का कारगर तरीका