Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

Обяснено за всеки оператор на SQL Server

В SQL Server можете да използвате ANY логически оператор за сравнение на скаларна стойност с набор от стойности от една колона, върнати от подзаявка.

Може да се използва с подзаявки, които имат набор от резултати от една колона.

ANY операторът е еквивалент на SOME логически оператор.

Пример

Да приемем, че имаме две таблици; Cats и Dogs

Котки

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

Кучета

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

Сега нека изпълним подзаявка с помощта на ANY оператор.

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

Резултат:

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

ANY срещу SOME

Ще получим същия резултат, ако променим заявката, така че да използва SOME оператор вместо ANY .

Тук се използва SOME оператор вместо ANY .

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

Резултат:

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

ANY срещу IN

Можем също да използваме IN оператор, за да получите същия резултат.

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

Резултат:

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

ANY срещу EXISTS

Бихме могли да направим същото с EXISTS оператор.

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

Резултат:

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

Грешка 116?

Ако получите грешка 116, когато използвате ANY , вероятно защото избирате няколко колони в подзаявката си. ANY операторът може да се използва само с подзаявки, които имат набор от резултати от една колона.

Ето пример за това как можем да причиним тази грешка.

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

Резултат:

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.

В този смисъл ANY операторът е по-подобен на IN оператор, отколкото е към EXISTS оператор. Ще получим същата грешка с IN .

Ако трябва да върнете няколко колони във вашата подзаявка, използвайте EXISTS .


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Възможно ли е да се конкатенират стойностите на колоните в низ с помощта на CTE?

  2. SQL Server 2008 - Как да върна дефиниран от потребителя тип таблица от функция с стойност на таблица?

  3. EXP() Примери в SQL Server

  4. Как да намерите трета или nᵗʰ максимална заплата от таблицата със заплати?

  5. Предотвратяване на SQL инжектиране в ASP.Net