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

SQL सर्वर में Msg 512 "सबक्वायरी ने 1 से अधिक मान लौटाए" को ठीक करें

यदि आपको त्रुटि संदेश 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 मिलेगा।


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. पता करें कि क्या ऑब्जेक्ट OBJECTPROPERTY () के साथ SQL सर्वर में एक टेबल-वैल्यूड फंक्शन है

  2. EXISTS बनाम जॉइन और EXISTS क्लॉज का उपयोग

  3. SQL सर्वर में IN लॉजिकल ऑपरेटर क्या है - SQL सर्वर / TSQL ट्यूटोरियल पार्ट 122

  4. SQL सर्वर - UNPIVOT का उपयोग करके NULL शामिल करें

  5. SQL सर्वर 2017 में एक तालिका बनाएँ