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

Обяснение на НЯКОИ оператор на SQL Server

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

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

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

Пример

Представете си, че имаме две маси; 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 = SOME (SELECT DogName FROM Dogs);

Резултат:

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

SOME срещу ANY

Както споменахме, SOME е еквивалент на ANY .

Така че бихме могли да променим нашата заявка да използва ANY вместо SOME .

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

Резултат:

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

SOME срещу IN

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

Тук той използва IN оператор.

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

Резултат:

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

SOME срещу EXISTS

Бихме могли да направим същото с 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, когато използвате SOME , вероятно защото избирате няколко колони в подзаявката си. SOME операторът може да се използва само с подзаявки, които имат набор от резултати от една колона.

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

SELECT 
    CatId,
    CatName
FROM Cats c 
WHERE c.CatName = SOME (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.

Ще получим същата грешка с 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. Как да получите кумулативна сума

  2. Как да покажете заявка и резултати в отделен раздел в SQL Server Management Studio (SSMS) - SQL Server / TSQL урок, част 15

  3. COUNT() срещу COUNT_BIG() в SQL Server:Каква е разликата?

  4. Как мога да премина от режим на SQL Server на Windows към смесен режим (SQL Server 2008)?

  5. SQL Server 2016