Udostępnij za pośrednictwem


W języku Transact-SQL ()

Określa, czy określona wartość jest zgodny z dowolną wartość w podzapytanie lub na liście.

Ikona łącza do tematuJęzyka Transact-SQL składni konwencje

Składnia

test_expression [ NOT ] IN 
    ( subquery | expression [ ,...n ]
    ) 

Argumenty

  • test_expression
    Wszelkie obowiązuje wyrażenie.

  • subquery
    To jest zestaw wyników jedną kolumna podzapytanie .Ta kolumna musi mieć dane tego samego typu jak test_expression.

  • expression[ ,... n ]
    Jest to lista wyrażeń do testowania dopasowanie.Wszystkie wyrażenia musi być tego samego typu co test_expression.

Typy wyników

Boolean

Wartość wyniku

Jeśli wartość test_expression jest równe żadnej wartości zwracane przez subquery lub jest równa jednej expression z rozdzielana przecinkami lista wartość wyniku ma wartość PRAWDA; w przeciwnym razie wartość wyniku ma wartość FAŁSZ.

Negacja przy użyciu NOT IN subquery wartość lub expression.

PrzestrogaPrzestroga

Wartości null , zwrócony przez subquery lub expression , są porównywane z test_expression W używany lub nie w zamian nieznane.null wartości razem z w lub nie może wygenerować nieoczekiwane wyniki.

Uwagi

W tym bardzo dużą liczbę wartości (wielu tysięcy) w w klauzula można zajmują zasoby i zwracać błędy 8623 lub 8632.Aby obejść ten problem, należy przechowywać elementów na liście w tabela.

Błąd 8623:

The query processor ran out of internal resources and could not produce a query plan. This is a rare event and only expected for extremely complex queries or queries that reference a very large number of tables or partitions. Please simplify the query. If you believe you have received this message in error, contact Customer Support Services for more information.

Błąd 8632:

Internal error: An expression services limit has been reached. Please look for potentially complex expressions in your query, and try to simplify them.

Przykłady

A.Porównanie lub i w

Poniższy przykład powoduje zaznaczenie listy imiona i nazwiska pracowników, którzy są projektowania inżynierów, projektanci narzędzie lub Asystentów handlowych.

USE AdventureWorks2008R2;
GO
SELECT p.FirstName, p.LastName, e.JobTitle
FROM Person.Person p
JOIN HumanResources.Employee AS e
    ON p.BusinessEntityID = e.BusinessEntityID
WHERE e.JobTitle = 'Design Engineer' 
   OR e.JobTitle = 'Tool Designer' 
   OR e.JobTitle = 'Marketing Assistant';
GO

Jednak takie same wyniki pobierania za pomocą IN.

USE AdventureWorks2008R2;
GO
SELECT p.FirstName, p.LastName, e.JobTitle
FROM Person.Person p
JOIN HumanResources.Employee AS e
    ON p.BusinessEntityID = e.BusinessEntityID
WHERE e.JobTitle IN ('Design Engineer', 'Tool Designer', 'Marketing Assistant');
GO

W tym miejscu jest zestaw wyników z dowolnej kwerendy.

FirstName   LastName      Title
---------   ---------   ---------------------
Sharon      Salavaria   Design Engineer                                   
Gail        Erickson    Design Engineer                                   
Jossef      Goldberg    Design Engineer                                   
Janice      Galvin      Tool Designer                                     
Thierry     D'Hers      Tool Designer                                     
Wanida      Benshoof    Marketing Assistant                               
Kevin       Brown       Marketing Assistant                               
Mary        Dempsey     Marketing Assistant                               

(8 row(s) affected)

B.Korzystanie z podzapytanie

Następujący przykład wyszukuje wszystkie identyfikatory dla sprzedawców w SalesPerson tabela dla pracowników, którzy mają normy sprzedaży większej niż 250 000 $ w roku, a następnie wybiera z Employee tabela nazw wszystkich pracowników w przypadku gdy EmployeeID pasujące wyniki z SELECT podzapytanie.

USE AdventureWorks2008R2;
GO
SELECT p.FirstName, p.LastName
FROM Person.Person AS p
    JOIN Sales.SalesPerson AS sp
    ON p.BusinessEntityID = sp.BusinessEntityID
WHERE p.BusinessEntityID IN
   (SELECT BusinessEntityID
   FROM Sales.SalesPerson
   WHERE SalesQuota > 250000);
GO

Oto zestaw wyników.

FirstName   LastName                                           
---------   -------- 
Tsvi         Reiter                                            
Michael      Blythe                                            
Tete         Mensa-Annan                                       

(3 row(s) affected)

C.Przy użyciu podzapytanieNOT IN

Następujący przykład wyszukuje sprzedawców, którzy nie większej niż 250 000 $ przydziału.NOT INWyszukuje sprzedawców, którzy nie pasują do elementów na liście wartości.

USE AdventureWorks2008R2
GO
SELECT p.FirstName, p.LastName
FROM Person.Person AS p
    JOIN Sales.SalesPerson AS sp
    ON p.BusinessEntityID = sp.BusinessEntityID
WHERE p.BusinessEntityID NOT IN
   (SELECT BusinessEntityID
   FROM Sales.SalesPerson
   WHERE SalesQuota > 250000);
GO