IN (Transact-SQL)
Gilt für: SQL Server
Azure SQL-Datenbank
Azure SQL verwaltete Instanz
Azure Synapse Analytics
Platform System (PDW)
SQL Analytics Platform-Endpunkt in Microsoft Fabric Warehouse in Microsoft Fabric Warehouse
Ermittelt, ob ein angegebener Wert mit einem Wert aus einer Unterabfrage oder Liste übereinstimmt.
Transact-SQL-Syntaxkonventionen
Syntax
test_expression [ NOT ] IN
( subquery | expression [ ,...n ]
)
Hinweis
Informationen zum Anzeigen der Transact-SQL-Syntax für SQL Server 2014 (12.x) und früher finden Sie unter Dokumentation zu früheren Versionen.
Argumente
test_expression
Ein beliebiger gültiger Ausdruck.
subquery
Ist eine Unterabfrage mit einem Resultset, das aus einer Spalte besteht. Diese Spalte muss denselben Datentyp besitzen wie test_expression.
expression[ ,... n ]
Eine Liste mit Ausdrücken, die auf Übereinstimmungen geprüft werden sollen. Alle Ausdrücke müssen denselben Datentyp besitzen wie test_expression.
Ergebnistypen
Boolescher Wert
Ergebniswert
Wenn der Wert von test_expression einem von der Unterabfrage zurückgegebenen Wert oder einem Ausdruck aus der durch Trennzeichen getrennten Liste entspricht, ist der Ergebniswert TRUE. Andernfalls ist der Ergebniswert FALSE.
Die Verwendung von NOT IN negiert den Wert der Unterabfrage oder den Ausdruck.
Achtung
Bei von der Unterabfrage oder dem Ausdruck zurückgegebenen NULL-Werten, die mithilfe von IN oder NOT IN mit test_expression verglichen werden, wird UNKNOWN zurückgegeben. Werden NULL-Werte zusammen mit IN oder NOT IN verwendet, kann dies zu unerwarteten Ergebnissen führen.
Hinweise
Wenn eine IN-Klausel eine extrem hohe Anzahl von Werten (viele Tausende durch Trennzeichen getrennte Werte) explizit in den Klammern enthält, können die Ressourcen überbeansprucht werden und die Fehler 8623 oder 8632 auftreten. Speichern Sie die Elemente in der IN-Liste in einer Tabelle, und verwenden Sie eine SELECT-Unterabfrage in einer IN-Klausel, um dieses Problem zu umgehen.
Fehler 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.
Fehler 8632:
Internal error: An expression services limit has been reached. Please look for potentially complex expressions in your query, and try to simplify them.
Beispiele
A. Vergleichen von OR und IN
Im folgenden Beispiel wird eine Liste der Namen von Mitarbeitern ausgewählt, die Konstruktionsingenieure, Werkzeugkonstrukteure oder Marketingassistenten sind.
-- Uses AdventureWorks
SELECT p.FirstName, p.LastName, e.JobTitle
FROM Person.Person AS 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
Sie können jedoch dieselben Ergebnisse mithilfe von IN abrufen.
-- Uses AdventureWorks
SELECT p.FirstName, p.LastName, e.JobTitle
FROM Person.Person AS p
JOIN HumanResources.Employee AS e
ON p.BusinessEntityID = e.BusinessEntityID
WHERE e.JobTitle IN ('Design Engineer', 'Tool Designer', 'Marketing Assistant');
GO
Im Folgenden wird das Resultset der beiden Abfragen aufgeführt.
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. Verwenden von IN mit einer Unterabfrage
Im folgenden Beispiel werden alle IDs der Vertriebsmitarbeiter in der SalesPerson
-Tabelle der Mitarbeiter ermittelt, deren jährliche Sollvorgabe über 250.000 EUR liegt, und aus der Employee
-Tabelle die Namen aller Mitarbeiter ausgewählt, bei denen EmployeeID
mit den Ergebnissen der SELECT
-Unterabfrage übereinstimmt.
-- Uses AdventureWorks
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
Hier ist das Resultset.
FirstName LastName
--------- --------
Tsvi Reiter
Michael Blythe
Tete Mensa-Annan
(3 row(s) affected)
C. Verwenden von NOT IN mit einer Unterabfrage
Im folgenden Beispiel werden die Vertriebsmitarbeiter gesucht, deren Quote 250.000 $ nicht übersteigt. NOT IN
sucht die Vertriebsmitarbeiter, die nicht den Elementen in der Werteliste entsprechen.
-- Uses AdventureWorks
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
Beispiele: Azure Synapse Analytics und Analytics-Plattformsystem (PDW)
D: Verwenden von IN und NOT IN
Im folgenden Beispiel werden alle Einträge in der Tabelle FactInternetSales
gefunden, die den Werten von SalesReasonKey
in der Tabelle DimSalesReason
entsprechen.
-- Uses AdventureWorks
SELECT * FROM FactInternetSalesReason
WHERE SalesReasonKey
IN (SELECT SalesReasonKey FROM DimSalesReason);
Im folgenden Beispiel werden alle Einträge in der Tabelle FactInternetSalesReason
gefunden, die den Werten von SalesReasonKey
in der Tabelle DimSalesReason
nicht entsprechen.
-- Uses AdventureWorks
SELECT * FROM FactInternetSalesReason
WHERE SalesReasonKey
NOT IN (SELECT SalesReasonKey FROM DimSalesReason);
E. Verwendung von IN mit einer Ausdrucksliste
Im folgenden Beispiel werden alle IDs der Vertriebsmitarbeiter in der Tabelle DimEmployee
gefunden, die den Vornamen Mike
oder Michael
haben.
-- Uses AdventureWorks
SELECT FirstName, LastName
FROM DimEmployee
WHERE FirstName IN ('Mike', 'Michael');
Weitere Informationen
CASE (Transact-SQL)
Ausdrücke (Transact-SQL)
Integrierte Funktionen (Transact-SQL)
Operatoren (Transact-SQL)
SELECT (Transact-SQL)
WHERE (Transact-SQL)
ALL (Transact-SQL)
SOME | ANY (Transact-SQL)