Any 和 All sql 子句

use*_*433 2 sql-server

select id 
from master_tabe 
where id = ALL (select id from user_table where name = 'Nikhil')

select id 
from master_tabe 
where id = ANY (select id from user_table where name = 'Nikhil')
Run Code Online (Sandbox Code Playgroud)

上面提到的查询返回相同的结果集。据我所知,应该有不同的结果集,因为 user_table 只有一条与姓名 Nikhil 相关的记录。因此,根据此 Any 子句必须返回 1 行,而 All 必须返回 0 条记录。而当我在 user_table 中添加一条记录时,All 子句语句返回 0 行,而 Any 子句仅返回 1 行。

有人可以调查一下吗?

Tho*_*ers 5

你得到的回报在我看来很正常。

当子查询返回的至少一个值比较为正时,ANY将返回 TRUE。从逻辑上讲,您可以将其与使用多个 OR 语句进行比较,对子查询返回的每个值进行一个 OR 比较。

另一方面,ALL要求子查询返回的每个值都进行正面比较。从逻辑上讲,您可以将其与使用多个 AND 语句进行比较,子查询返回的每个值对应一个 AND 语句。

您声明子查询最初返回了一条记录。因此,无论您使用 ALL 还是 ANY 都没有关系。一旦您添加了另一条记录,就会有所不同。那时子查询中有多个值(ID)要比较,它们将在逻辑上被评估为 OR/AND 语句

例子

CREATE TABLE dbo.Tbl (ID int)   
GO  

INSERT dbo.Tbl VALUES (1),(2),(3)
GO

CREATE TABLE dbo.SubTbl (ID int)   
GO  

INSERT dbo.SubTbl VALUES (1),(2)
GO


SELECT ID
FROM dbo.Tbl 
WHERE ID = ANY(SELECT ID FROM dbo.SubTbl)
GO

-- Has the same result as ANY:
SELECT ID
FROM dbo.Tbl 
WHERE ID = 1 OR ID = 2
GO

SELECT ID
FROM dbo.Tbl 
WHERE ID = ALL(SELECT ID FROM dbo.SubTbl)
GO

-- Has the same result as ALL:
SELECT ID
FROM dbo.Tbl 
WHERE ID = 1 AND ID = 2
GO
Run Code Online (Sandbox Code Playgroud)