sql >> Databáze >  >> RDS >> Sqlserver

SQL Server Vysvětlení libovolného operátora

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 .


  1. Jak přidám indexy do tabulek MySQL?

  2. Oracle - Klonovací tabulka - Struktura, datová omezení a vše

  3. Jak vybrat pouze první řádky pro každou jedinečnou hodnotu sloupce?

  4. Jak mohu pomocí MySQL dotazovat mezi dvěma daty?