Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Wyjaśnienie niektórych operatorów SQL Server

W SQL Server możesz użyć SOME operator logiczny do porównania wartości skalarnej z jednokolumnowym zestawem wartości zwracanych przez podzapytanie.

Może być używany z podzapytaniami, które mają zestaw wyników składający się z jednej kolumny.

SOME operator jest odpowiednikiem ANY operator logiczny.

Przykład

Wyobraź sobie, że mamy dwa stoły; Cats i Dogs

Koty

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

Psy

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

Teraz uruchommy podzapytanie za pomocą ANY operatora.

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

Wynik:

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

SOME kontra ANY

Jak wspomniano, SOME jest odpowiednikiem ANY .

Możemy więc zmienić nasze zapytanie tak, aby używało ANY zamiast SOME .

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

Wynik:

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

SOME vs IN

Otrzymalibyśmy ten sam wynik, gdybyśmy zmienili zapytanie tak, aby używało IN operator zamiast SOME .

Tutaj używa IN operatora.

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

Wynik:

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

SOME vs EXISTS

Moglibyśmy zrobić to samo z EXISTS operatora.

Tutaj używa EXISTS operatora.

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

Wynik:

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

Błąd 116?

Jeśli pojawi się błąd 116 podczas używania SOME , prawdopodobnie dlatego, że wybierasz wiele kolumn w podzapytaniu. SOME Operator może być używany tylko z podzapytaniami, które mają zestaw wyników składający się z jednej kolumny.

Oto przykład tego, jak możemy spowodować ten błąd.

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

Wynik:

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.

Otrzymalibyśmy ten sam błąd z IN . Jeśli musisz zwrócić wiele kolumn w podzapytaniu, użyj 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. Usuń dane za pomocą funkcji wartościującej tabelę w SQL Server

  2. Jak znaleźć kolejne wiersze na podstawie wartości kolumny?

  3. Generatory danych dla serwera SQL?

  4. Typ danych VarBinary vs Image SQL Server do przechowywania danych binarnych?

  5. Jak obcinać wszystkie tabele w bazie danych za pomocą TSQL?