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

SQL Server DOWOLNY operator wyjaśniony

W SQL Server możesz użyć ANY 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.

ANY operator jest odpowiednikiem SOME operator logiczny.

Przykład

Załóżmy, ż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 = ANY (SELECT DogName FROM Dogs);

Wynik:

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

ANY vs SOME

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

Tutaj używa SOME operator zamiast ANY .

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

Wynik:

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

ANY vs IN

Możemy również użyć IN operatora, aby uzyskać ten sam wynik.

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

Wynik:

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

ANY vs EXISTS

Moglibyśmy zrobić to samo z 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 ANY , prawdopodobnie dlatego, że wybierasz wiele kolumn w podzapytaniu. ANY 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 = ANY (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.

W tym sensie ANY operator jest bardziej podobny do IN operator niż jest do EXISTS operator. 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. Data/sygnatura czasowa do zarejestrowania, kiedy rekord został dodany do tabeli?

  2. Jak uniknąć szkodliwego wpływu monitora aktywności na wydajność serwera SQL?

  3. Dzielenie wartości rozdzielonych przecinkami w kolumnach na wiele wierszy w Sql Server

  4. Jak naprawić błąd „Dostawca nazwanych potoków, błąd 40 — nie można otworzyć połączenia z serwerem SQL Server”?

  5. Czy są jakieś wady, aby zawsze używać nvarchar(MAX)?