T-SQL"<> ANY(子查询)"

时间:2016-10-03 15:39:02

标签: sql-server

我对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的行,这是销售人员未涵盖的行。

3 个答案:

答案 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)