我对Any-Operator有疑问。
在Technet上它说
例如,以下查询查找位于任何销售人员未涵盖的区域内的客户。
Use AdventureWorks2008R2;
GO
SELECT
CustomerID
FROM
Sales.Customer
WHERE
TerritoryID <> ANY
(
SELECT
TerritoryID
FROM
Sales.SalesPerson
);
另外
结果包括所有客户,但销售区域为NULL的客户除外,因为分配给客户的每个区域都由销售人员承保。内部查询查找销售人员所涵盖的所有销售区域,然后,对于每个区域,外部查询查找不在一个区域内的客户。
但该查询会返回所有客户。 我将客户TerritoryID更新为没有sales.person的值,但该查询仍返回所有客户,而不是我期望的客户..
我错过了什么吗? 可能那篇关于technet的文章完全错了吗? https://technet.microsoft.com/de-de/library/ms187074(v=sql.105).aspx(德语)
有一个客户的TerritoryID = 13
内部查询结果(SELECT TerritoryID FROM Sales.SalesPerson): 4 2 4 3 6 五 1 4 6 1 1 6 9 1 8 10 7
在表中,Sales.Customer是一个CustomerID = 13的行,这是销售人员未涵盖的行。
答案 0 :(得分:1)
create table #t1
(
id int
)
insert into #t1
values(1),(2),(3)
如您所见,T1有三个值
现在让我们看看,如何工作
当&#39;等于&#39;与任何一起使用,它的工作方式与IN
相同select * from #t1 where id=
any(select 0)--no result
当Any
与&gt;一起使用时或&lt;&gt; ,Any
表示获取所有大于最小值的值
select * from #t1 where id<>
any(select 1)--2,3
select * from #t1 where id<>
any(select 0)--1,2,3
如果子查询返回一个值,外部查询将尝试获取大于内部查询的值
答案 1 :(得分:1)
<> ANY
表示任何Sales.Customer的TerritoryID大于或小于Sales.SalesPerson
中的任何TerritoryID
所以TerritoryID = 13
大于所有或您的示例(4 2 4 3 6 5 1 4 6 1 1 6 9 1 8 10 7)
,因此包含在内。
<> ALL
相当于NOT IN
,因此您将<> ANY
与
将<> ANY
视为,如果集合中的任何记录与quailifier不相等,则包含它。
答案 2 :(得分:-1)
以下查询具有相同的结果:
SELECT CustomerID FROM Sales.Customer
WHERE TerritoryID NOT IN (SELECT TerritoryID FROM Sales.SalesPerson)