यदि आपको त्रुटि संदेश 512 मिलता है जो SQL सर्वर में "सबक्वायरी ने 1 से अधिक मान लौटाया है ..." पढ़ता है, तो ऐसा इसलिए है क्योंकि आप एक ऐसी सबक्वायरी का उपयोग कर रहे हैं जो एक परिदृश्य में एक से अधिक मान लौटाती है जहां इसकी अनुमति नहीं है।
त्रुटि का उदाहरण
मान लीजिए हमारे पास निम्नलिखित दो टेबल हैं:
SELECT * FROM Dogs;
SELECT * FROM Cats;
परिणाम:
+---------+-----------+ | DogId | DogName | |---------+-----------| | 1 | Fetch | | 2 | Fluffy | | 3 | Wag | | 4 | Fluffy | +---------+-----------+ +---------+-----------+ | CatId | CatName | |---------+-----------| | 1 | Meow | | 2 | Fluffy | | 3 | Scratch | +---------+-----------+
और हम उन दो तालिकाओं के विरुद्ध निम्न क्वेरी चलाते हैं:
SELECT * FROM Dogs
WHERE DogName = ( SELECT CatName FROM Cats );
परिणाम:
Msg 512, Level 16, State 1, Line 1 Subquery returned more than 1 value. This is not permitted when the subquery follows =, !=, <, <= , >, >= or when the subquery is used as an expression.
हम देख सकते हैं कि इसके परिणामस्वरूप त्रुटि संदेश 512 हुआ।
यह त्रुटि संदेश हमें स्पष्ट रूप से बताता है कि "सबक्वायरी ने 1 से अधिक मान लौटाया" और यह कि "इसकी अनुमति नहीं है जब सबक्वेरी का अनुसरण करता है =,!=, <, <=,>,>=या जब सबक्वेरी का उपयोग एक एक्सप्रेशन के रूप में किया जाता है। .
इसका समाधान इस बात पर निर्भर करेगा कि आप क्वेरी में क्या करने का प्रयास कर रहे हैं। इस समस्या के समाधान के लिए नीचे कुछ विकल्प दिए गए हैं।
समाधान 1
इससे निपटने का एक तरीका एक अलग ऑपरेटर का उपयोग करना है। मेरा मतलब है, =
. के अलावा किसी अन्य ऑपरेटर का उपयोग करें , !=
, <
, <=
, >
, या >=
।
यहां एक उदाहरण दिया गया है जो IN
. का उपयोग करता है ऑपरेटर:
SELECT * FROM Dogs
WHERE DogName IN ( SELECT CatName FROM Cats );
परिणाम:
+---------+-----------+ | DogId | DogName | |---------+-----------| | 2 | Fluffy | | 4 | Fluffy | +---------+-----------+
समाधान 2
एक अन्य विकल्प बराबरी रखना है (=
) ऑपरेटर (या जो भी ऑपरेटर मूल क्वेरी में है), लेकिन सबक्वेरी बदल दें।
बराबर ऑपरेटर रखते हुए सबक्वेरी बदलने का एक उदाहरण यहां दिया गया है:
SELECT * FROM Dogs
WHERE DogName = ( SELECT CatName FROM Cats WHERE CatId = 2 );
परिणाम:
+---------+-----------+ | DogId | DogName | |---------+-----------| | 2 | Fluffy | | 4 | Fluffy | +---------+-----------+
इस मामले में सबक्वायरी ने केवल एक मान लौटाया, और बराबर ऑपरेटर उसके साथ ठीक था।
समाधान 3
ध्यान दें कि उपरोक्त उपश्रेणियाँ केवल एक कॉलम लौटाती हैं। यदि सबक्वेरी कई कॉलम लौटाती है, तो हमें बाहरी क्वेरी को बदलना होगा ताकि वह EXISTS
का उपयोग कर सके। ऑपरेटर।
उदाहरण:
SELECT * FROM Dogs d
WHERE EXISTS ( SELECT * FROM Cats c WHERE c.CatName = d.DogName );
परिणाम:
+---------+-----------+ | DogId | DogName | |---------+-----------| | 2 | Fluffy | | 4 | Fluffy | +---------+-----------+
अगर हमने इसे EXISTS
. का उपयोग करने के लिए नहीं बदला है ऑपरेटर, तो हमें शायद त्रुटि संदेश 116 मिलेगा।