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

SQL Server NOGEN operatør forklaret

I SQL Server kan du bruge SOME logisk operator til at sammenligne en skalarværdi med et enkelt-kolonne sæt værdier, der returneres af en underforespørgsel.

Det kan bruges med underforespørgsler, der har et resultatsæt på én kolonne.

SOME operatoren svarer til ANY logisk operator.

Eksempel

Forestil dig, at vi har to borde; Cats og Dogs

Katte

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

Hunde

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

Lad os nu køre en underforespørgsel ved hjælp af ANY operatør.

SELECT 
    CatId,
    CatName
FROM Cats c 
WHERE c.CatName = SOME (SELECT DogName FROM Dogs);

Resultat:

+---------+-----------+
| CatId   | CatName   |
|---------+-----------|
| 2       | Fluffy    |
+---------+-----------+

SOME vs ANY

Som nævnt, SOME svarer til ANY .

Så vi kunne ændre vores forespørgsel til at bruge ANY i stedet for SOME .

SELECT 
    CatId,
    CatName
FROM Cats c 
WHERE c.CatName = ANY (SELECT DogName FROM Dogs);

Resultat:

+---------+-----------+
| CatId   | CatName   |
|---------+-----------|
| 2       | Fluffy    |
+---------+-----------+

SOME vs IN

Vi ville få det samme resultat, hvis vi ændrede forespørgslen, så den bruger IN operator i stedet for SOME .

Her bruger den IN operatør.

SELECT 
    CatId,
    CatName
FROM Cats c 
WHERE c.CatName IN (SELECT DogName FROM Dogs);

Resultat:

+---------+-----------+
| CatId   | CatName   |
|---------+-----------|
| 2       | Fluffy    |
+---------+-----------+

SOME vs EXISTS

Vi kunne gøre det samme med EXISTS operatør.

Her bruger den EXISTS operatør.

SELECT 
    CatId,
    CatName
FROM Cats c 
WHERE EXISTS (SELECT DogId, DogName FROM Dogs d
WHERE c.CatName = d.DogName);

Resultat:

+---------+-----------+
| CatId   | CatName   |
|---------+-----------|
| 2       | Fluffy    |
+---------+-----------+

Fejl 116?

Hvis du får fejl 116, når du bruger SOME , er det sandsynligvis fordi du vælger flere kolonner i din underforespørgsel. SOME operator kan kun bruges med underforespørgsler, der har et resultatsæt på én kolonne.

Her er et eksempel på, hvordan vi kan forårsage denne fejl.

SELECT 
    CatId,
    CatName
FROM Cats c 
WHERE c.CatName = SOME (SELECT * FROM Dogs);

Resultat:

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.

Vi ville få den samme fejl med IN . Hvis du skal returnere flere kolonner i din underforespørgsel, skal du bruge EXISTS .


  1. MySQL prøvedatabase

  2. Bedste måde at teste, om der findes en række i en MySQL-tabel

  3. Sådan fungerer MapReduce i Hadoop

  4. Hvordan får man størrelsen på mysql-databasen?