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 .