确定指定的值是否与子查询或列表中的值相匹配。
Transact-SQL 语法约定
test_expression [ NOT ] IN ( subquery | expression [ ,...n ] )
任何有效的表达式。
包含某列结果集的子查询。该列必须与 test_expression 具有相同的数据类型。
一个表达式列表,用来测试是否匹配。所有的表达式必须与 test_expression 具有相同的类型。
Boolean
在 IN 子句中包括数量非常多的值(数以千计)可能会消耗资源并返回错误 8623 或 8632。若要解决这一问题,请将这些项存储于某个表的 IN 列表中。
错误 8623:
查询处理器用尽了内部资源,无法生成查询计划。这种情况很少出现,只有在查询极其复杂或引用了大量表或分区时才会出现。请简化查询。如果您认为该消息的出现纯属错误,请与客户支持服务部门联系,了解详细信息。
错误 8632:
内部错误: 达到了表达式服务限制。请在您的查询中查找潜在的复杂表达式,并尝试简化它们。
如果 test_expression 的值与 subquery 所返回的任何值相等,或与逗号分隔的列表中的任何 expression 相等,则结果值为 TRUE;否则,结果值为 FALSE。
使用 NOT IN 对 subquery 值或 expression 求反。
以下示例选择设计工程师、工具设计人员或销售助理等雇员的姓名列表。
USE AdventureWorks; GO SELECT FirstName, LastName, e.Title FROM HumanResources.Employee AS e JOIN Person.Contact AS c ON e.ContactID = c.ContactID WHERE e.Title = 'Design Engineer' OR e.Title = 'Tool Designer' OR e.Title = 'Marketing Assistant'; GO
但是,也可以使用 IN 检索相同的结果:
USE AdventureWorks; GO SELECT FirstName, LastName, e.Title FROM HumanResources.Employee AS e JOIN Person.Contact AS c ON e.ContactID = c.ContactID WHERE e.Title IN ('Design Engineer', 'Tool Designer', 'Marketing Assistant'); GO
以下是上面任一查询的结果集。
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)
以下示例查找 SalesPerson 表中所有销售人员的 ID 以获得当年销售额超过 $250,000 的雇员,然后从 Employee 表中选择 EmployeeID 与 SELECT 子查询的结果相匹配的所有雇员的姓名。
SalesPerson
Employee
EmployeeID
SELECT
USE AdventureWorks; GO SELECT FirstName, LastName FROM Person.Contact AS c JOIN HumanResources.Employee AS e ON e.ContactID = c.ContactID WHERE EmployeeID IN (SELECT SalesPersonID FROM Sales.SalesPerson WHERE SalesQuota > 250000); GO
下面是结果集:
FirstName LastName --------- -------- Tsvi Reiter Michael Blythe Tete Mensa-Annan (3 row(s) affected)
以下示例查找销售额不超过 $250,000 的销售人员。NOT IN 查找与值列表中的项不匹配的销售人员。
NOT IN
USE AdventureWorks GO SELECT FirstName, LastName FROM Person.Contact AS c JOIN HumanResources.Employee AS e ON e.ContactID = c.ContactID WHERE EmployeeID NOT IN (SELECT SalesPersonID FROM Sales.SalesPerson WHERE SalesQuota > 250000) GO