Freigeben über


IN (Transact-SQL)

Gilt für: SQL Server Azure SQL-Datenbank Azure SQL Managed Instance Azure Synapse Analytics Analytics Platform System (PDW) SQL-Analyseendpunkt in Microsoft Fabric Warehouse in Microsoft Fabric SQL-Datenbank in Microsoft Fabric

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 ]  
    )   

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 sehen Sie das Ergebnis.

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)