sql >> Databasteknik >  >> RDS >> Sqlserver

SQL Server ALLA operatörer förklaras

I SQL Server kan du använda ANY logisk operator för att jämföra ett skalärt värde med en uppsättning värden i en kolumn som returneras av en underfråga.

Den kan användas med underfrågor som har en resultatuppsättning av en kolumn.

ANY operatorn är motsvarigheten till SOME logisk operator.

Exempel

Antag att vi har två tabeller; Cats och Dogs

Katter

+---------+-----------+
| CatId   | CatName   |
|---------+-----------|
| 1       | Meow      |
| 2       | Fluffy    |
| 3       | Scratch   |
+---------+-----------+

Hundar

+---------+-----------+
| DogId   | DogName   |
|---------+-----------|
| 1       | Fetch     |
| 2       | Fluffy    |
| 3       | Wag       |
+---------+-----------+

Låt oss nu köra en underfråga med ANY operatör.

SELECT 
    CatId,
    CatName
FROM Cats c 
WHERE c.CatName = ANY (SELECT DogName FROM Dogs);

Resultat:

+---------+-----------+
| CatId   | CatName   |
|---------+-----------|
| 2       | Fluffy    |
+---------+-----------+

ANY kontra SOME

Vi skulle få samma resultat om vi skulle ändra frågan så att den använder SOME operator istället för ANY .

Här använder den SOME operator istället för ANY .

SELECT 
    CatId,
    CatName
FROM Cats c 
WHERE c.CatName = SOME (SELECT DogName FROM Dogs);

Resultat:

+---------+-----------+
| CatId   | CatName   |
|---------+-----------|
| 2       | Fluffy    |
+---------+-----------+

ANY kontra IN

Vi kan också använda IN för att få samma resultat.

SELECT 
    CatId,
    CatName
FROM Cats c 
WHERE c.CatName IN (SELECT DogName FROM Dogs);

Resultat:

+---------+-----------+
| CatId   | CatName   |
|---------+-----------|
| 2       | Fluffy    |
+---------+-----------+

ANY kontra EXISTS

Vi skulle kunna göra samma sak med EXISTS operatör.

SELECT 
    CatId,
    CatName
FROM Cats c 
WHERE EXISTS (SELECT DogId, DogName FROM Dogs d
WHERE c.CatName = d.DogName);

Resultat:

+---------+-----------+
| CatId   | CatName   |
|---------+-----------|
| 2       | Fluffy    |
+---------+-----------+

Fel 116?

Om du får fel 116 när du använder ANY , beror det förmodligen på att du väljer flera kolumner i din underfråga. ANY operatorn kan endast användas med underfrågor som har en resultatuppsättning av en kolumn.

Här är ett exempel på hur vi kan orsaka detta fel.

SELECT 
    CatId,
    CatName
FROM Cats c 
WHERE c.CatName = ANY (SELECT * FROM Dogs);

Resultat:

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.

I denna mening är ANY operatorn är mer lik IN operatorn än den är till EXISTS operatör. Vi skulle få samma fel med IN .

Om du måste returnera flera kolumner i din underfråga, använd EXISTS .


  1. Hur man får nya användare per dag i MySQL

  2. Hur ändrar man datumstil i PostgreSQL?

  3. Hur språkinställningar kan påverka dina FORMAT()-resultat i SQL Server (T-SQL-exempel)

  4. DBCA Skapa databas dålig REMOTE_LISTENER