sql >> Database teknologi >  >> RDS >> Sqlserver

Ret Msg 512 "Underforespørgsel returnerede mere end 1 værdi" i SQL Server

Hvis du får fejlmeddelelse 512, der lyder "Subquery returned more than 1 value..." i SQL Server, er det fordi du bruger en underforespørgsel, der returnerer mere end én værdi i et scenarie, hvor dette ikke er tilladt.

Eksempel på fejl

Antag, at vi har følgende to tabeller:

SELECT * FROM Dogs;

SELECT * FROM Cats;

Resultat:

+---------+-----------+
| DogId   | DogName   |
|---------+-----------|
| 1       | Fetch     |
| 2       | Fluffy    |
| 3       | Wag       |
| 4       | Fluffy    |
+---------+-----------+

+---------+-----------+
| CatId   | CatName   |
|---------+-----------|
| 1       | Meow      |
| 2       | Fluffy    |
| 3       | Scratch   |
+---------+-----------+

Og vi kører følgende forespørgsel mod disse to tabeller:

SELECT * FROM Dogs 
WHERE DogName = ( SELECT CatName FROM Cats );

Resultat:

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.

Vi kan se, at det resulterede i fejlmeddelelse 512.

Denne fejlmeddelelse fortæller os eksplicit, at "Underforespørgslen returnerede mere end 1 værdi", og at "Dette er ikke tilladt, når underforespørgslen følger efter =, !=, <, <=,>,>=, eller når underforespørgslen bruges som et udtryk ”.

Løsningen på dette vil afhænge af, hvad du forsøger at gøre i forespørgslen. Nedenfor er et par muligheder for at løse dette problem.

Løsning 1

En måde at håndtere dette på er at bruge en anden operatør. Hvad jeg mener er, brug en anden operator end = , != , < , <= , > eller >= .

Her er et eksempel, der bruger IN operatør:

SELECT * FROM Dogs 
WHERE DogName IN ( SELECT CatName FROM Cats );

Resultat:

+---------+-----------+
| DogId   | DogName   |
|---------+-----------|
| 2       | Fluffy    |
| 4       | Fluffy    |
+---------+-----------+

Løsning 2

En anden mulighed er at beholde lige (= ) operator (eller hvilken som helst operator der er i den oprindelige forespørgsel), men skift underforespørgslen.

Her er et eksempel på at ændre underforespørgslen, mens du beholder equals-operatoren:

SELECT * FROM Dogs 
WHERE DogName = ( SELECT CatName FROM Cats WHERE CatId = 2 );

Resultat:

+---------+-----------+
| DogId   | DogName   |
|---------+-----------|
| 2       | Fluffy    |
| 4       | Fluffy    |
+---------+-----------+

I dette tilfælde returnerede underforespørgslen kun én værdi, og lige-operatoren havde det fint med det.

Løsning 3

Bemærk, at ovenstående underforespørgsler kun returnerer én kolonne. Hvis underforespørgslerne returnerede flere kolonner, er vi nødt til at ændre den ydre forespørgsel, så den bruger EXISTS operatør.

Eksempel:

SELECT * FROM Dogs d
WHERE EXISTS ( SELECT * FROM Cats c WHERE c.CatName = d.DogName );

Resultat:

+---------+-----------+
| DogId   | DogName   |
|---------+-----------|
| 2       | Fluffy    |
| 4       | Fluffy    |
+---------+-----------+

Hvis vi ikke ændrede det til at bruge EXISTS operatør, så ville vi sandsynligvis få fejlmeddelelse 116.


  1. Hvordan pg_sleep_until() virker i PostgreSQL

  2. Hvordan ændrer man MySQL-tabelnavne i Linux-serveren, så de ikke skelner mellem store og små bogstaver?

  3. Design af en database til et rekrutteringssystem

  4. MySQL-indekser - hvad er den bedste praksis?