W języku Transact-SQL ()
Określa, czy określona wartość jest zgodny z dowolną wartość w podzapytanie lub na liście.
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.
Przestroga |
---|
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
Zobacz także