V SQL Server můžete použít SOME
logický operátor pro porovnání skalární hodnoty s jednosloupcovou sadou hodnot vrácených dílčím dotazem.
Lze jej použít s poddotazy, které mají sadu výsledků s jedním sloupcem.
SOME
operátor je ekvivalentem ANY
logický operátor.
Příklad
Představte si, že máme dva stoly; Cats
a Dogs
Kočky
+---------+-----------+ | CatId | CatName | |---------+-----------| | 1 | Meow | | 2 | Fluffy | | 3 | Scratch | +---------+-----------+
Psi
+---------+-----------+ | DogId | DogName | |---------+-----------| | 1 | Fetch | | 2 | Fluffy | | 3 | Wag | +---------+-----------+
Nyní spusťte dílčí dotaz pomocí ANY
operátor.
SELECT
CatId,
CatName
FROM Cats c
WHERE c.CatName = SOME (SELECT DogName FROM Dogs);
Výsledek:
+---------+-----------+ | CatId | CatName | |---------+-----------| | 2 | Fluffy | +---------+-----------+
SOME
vs ANY
Jak již bylo zmíněno, SOME
je ekvivalentem ANY
.
Takže bychom mohli změnit náš dotaz tak, aby používal ANY
místo SOME
.
SELECT
CatId,
CatName
FROM Cats c
WHERE c.CatName = ANY (SELECT DogName FROM Dogs);
Výsledek:
+---------+-----------+ | CatId | CatName | |---------+-----------| | 2 | Fluffy | +---------+-----------+
SOME
vs IN
Stejný výsledek bychom dostali, kdybychom dotaz změnili tak, aby používal IN
operátor namísto SOME
.
Zde je to pomocí IN
operátor.
SELECT
CatId,
CatName
FROM Cats c
WHERE c.CatName IN (SELECT DogName FROM Dogs);
Výsledek:
+---------+-----------+ | CatId | CatName | |---------+-----------| | 2 | Fluffy | +---------+-----------+
SOME
vs EXISTS
Totéž bychom mohli udělat s EXISTS
operátor.
Zde se používá EXISTS
operátor.
SELECT
CatId,
CatName
FROM Cats c
WHERE EXISTS (SELECT DogId, DogName FROM Dogs d
WHERE c.CatName = d.DogName);
Výsledek:
+---------+-----------+ | CatId | CatName | |---------+-----------| | 2 | Fluffy | +---------+-----------+
Chyba 116?
Pokud se při použití SOME
zobrazí chyba 116 , je to pravděpodobně proto, že ve svém poddotazu vybíráte více sloupců. SOME
Operátor lze použít pouze s poddotazy, které mají sadu výsledků s jedním sloupcem.
Zde je příklad toho, jak můžeme tuto chybu způsobit.
SELECT
CatId,
CatName
FROM Cats c
WHERE c.CatName = SOME (SELECT * FROM Dogs);
Výsledek:
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.
Stejnou chybu bychom dostali s IN
. Pokud musíte ve svém poddotazu vrátit více sloupců, použijte EXISTS
.