Bagikan melalui


IN (Transact-SQL)

Berlaku untuk: Titik akhir analitik SQL Server Azure SQL Database Azure SQL Managed Instance Azure Synapse Analytics Platform System (PDW) SQL di Microsoft Fabric Warehouse di Microsoft Fabric

Menentukan apakah nilai yang ditentukan cocok dengan nilai mana pun dalam kueri bertumpuk atau daftar.

Konvensi sintaks transact-SQL

Sintaks

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

Argumen

test_expression
Adalah ekspresi yang valid.

kueri bertumpuk
Adalah subkueri yang memiliki kumpulan hasil dari satu kolom. Kolom ini harus memiliki tipe data yang sama dengan test_expression.

expression[ ,... n ]
Adalah daftar ekspresi yang akan diuji untuk kecocokan. Semua ekspresi harus berjenis sama dengan test_expression.

Jenis Hasil

Boolean

Nilai Hasil

Jika nilai test_expression sama dengan nilai apa pun yang dikembalikan oleh subkueri atau sama dengan ekspresi apa pun dari daftar yang dipisahkan koma, nilai hasilnya TRUE; jika tidak, nilai hasilnya adalah FALSE.

Menggunakan NOT IN meniadakan nilai atau ekspresi subkueri.

Perhatian

Nilai null apa pun yang dikembalikan oleh subkueri atau ekspresi yang dibandingkan dengan test_expression menggunakan IN atau NOT IN mengembalikan UNKNOWN. Menggunakan nilai null bersama dengan IN atau NOT IN dapat menghasilkan hasil yang tidak terduga.

Keterangan

Secara eksplisit termasuk sejumlah besar nilai (ribuan nilai yang dipisahkan oleh koma) dalam tanda kurung, dalam klausul IN dapat menggunakan sumber daya dan mengembalikan kesalahan 8623 atau 8632. Untuk mengatasi masalah ini, simpan item dalam daftar IN dalam tabel, dan gunakan subkueri SELECT dalam klausa IN.

Kesalahan 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.

Kesalahan 8632:

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

Contoh

J. Membandingkan OR dan IN

Contoh berikut memilih daftar nama karyawan yang merupakan insinyur desain, perancang alat, atau asisten pemasaran.

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

Namun, Anda mengambil hasil yang sama dengan menggunakan IN.

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

Berikut adalah tataan hasil dari salah satu kueri.

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. Menggunakan IN dengan subkueri

Contoh berikut menemukan semua ID untuk tenaga penjualan dalam SalesPerson tabel untuk karyawan yang memiliki kuota penjualan lebih besar dari $ 250.000 untuk tahun itu, lalu memilih dari Employee tabel nama semua karyawan di mana EmployeeID yang cocok dengan hasil dari SELECT subkueri.

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

Berikut set hasilnya.

FirstName   LastName                                             
---------   --------   
Tsvi         Reiter                                              
Michael      Blythe                                              
Tete         Mensa-Annan                                         
  
(3 row(s) affected)  

C. Menggunakan NOT IN dengan subkueri

Contoh berikut menemukan tenaga penjualan yang tidak memiliki kuota lebih besar dari $250.000. NOT IN menemukan tenaga penjualan yang tidak cocok dengan item dalam daftar nilai.

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

Contoh: Azure Synapse Analytics and Analytics Platform System (PDW)

D. Menggunakan IN dan NOT IN

Contoh berikut menemukan semua entri dalam tabel yang cocok dengan FactInternetSales SalesReasonKey nilai dalam DimSalesReason tabel.

-- Uses AdventureWorks  
  
SELECT * FROM FactInternetSalesReason   
WHERE SalesReasonKey   
IN (SELECT SalesReasonKey FROM DimSalesReason);   

Contoh berikut menemukan semua entri dalam FactInternetSalesReason tabel yang tidak cocok dengan SalesReasonKey nilai dalam DimSalesReason tabel.

-- Uses AdventureWorks  
  
SELECT * FROM FactInternetSalesReason   
WHERE SalesReasonKey   
NOT IN (SELECT SalesReasonKey FROM DimSalesReason);  

E. Menggunakan IN dengan daftar ekspresi

Contoh berikut menemukan semua ID untuk tenaga penjualan dalam DimEmployee tabel untuk karyawan yang memiliki nama depan baik Mike atau Michael.

-- Uses AdventureWorks  
  
SELECT FirstName, LastName  
FROM DimEmployee  
WHERE FirstName IN ('Mike', 'Michael');  

Lihat Juga

CASE (Transact-SQL)
Ekspresi (Transact-SQL)
Fungsi Bawaan (Transact-SQL)
Operator (Transact-SQL)
SELECT (Transact-SQL)
WHERE (Transact-SQL)
SEMUA (T-SQL)
BEBERAPA | ANY (Transact-SQL)