V SQL Server můžete použít ANY 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.
ANY operátor je ekvivalentem SOME logický operátor.
Příklad
Předpokládejme, že máme dvě tabulky; 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 = ANY (SELECT DogName FROM Dogs); Výsledek:
+---------+-----------+ | CatId | CatName | |---------+-----------| | 2 | Fluffy | +---------+-----------+
ANY vs SOME
Stejný výsledek bychom dostali, kdybychom dotaz změnili tak, aby používal SOME operátor namísto ANY .
Zde je to pomocí SOME operátor namísto ANY .
SELECT
CatId,
CatName
FROM Cats c
WHERE c.CatName = SOME (SELECT DogName FROM Dogs); Výsledek:
+---------+-----------+ | CatId | CatName | |---------+-----------| | 2 | Fluffy | +---------+-----------+
ANY vs IN
Můžeme také použít IN operátora, abyste získali stejný výsledek.
SELECT
CatId,
CatName
FROM Cats c
WHERE c.CatName IN (SELECT DogName FROM Dogs); Výsledek:
+---------+-----------+ | CatId | CatName | |---------+-----------| | 2 | Fluffy | +---------+-----------+
ANY vs EXISTS
Totéž bychom mohli udělat s 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í ANY zobrazí chyba 116 , je to pravděpodobně proto, že ve svém poddotazu vybíráte více sloupců. ANY 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 = ANY (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.
V tomto smyslu ANY operátor je více podobný IN než je tomu u EXISTS operátor. Stejnou chybu bychom dostali s IN .
Pokud musíte ve svém poddotazu vrátit více sloupců, použijte EXISTS .