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

SQL Server Vysvětlení NĚKTERÉHO operátora

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 .


  1. Pořiďte si svůj vlastní cloud dostupný pro DigitalOcean

  2. Nový příznak trasování pro opravu výkonu proměnné tabulky

  3. Spouštění souborů MySQL *.sql v PHP

  4. Vygenerujte sadu nebo sekvenci bez smyček – část 2