【发布时间】:2010-11-25 22:05:47
【问题描述】:
根据SOME | ANY (Transact-SQL) 上的 MSDN BOL (Books Online) 描述,
SOME 和 ANY 是等价的。
使用 SOME | 中的任何一个都有意义。 ANY 使查询更具可读性。
但是是唯一的原因,为什么 TSQL 中有 2 个关键字用于完全相同的目的?
它们具有相同功能是否有任何历史原因?
【问题讨论】:
标签: sql sql-server tsql
根据SOME | ANY (Transact-SQL) 上的 MSDN BOL (Books Online) 描述,
SOME 和 ANY 是等价的。
使用 SOME | 中的任何一个都有意义。 ANY 使查询更具可读性。
但是是唯一的原因,为什么 TSQL 中有 2 个关键字用于完全相同的目的?
它们具有相同功能是否有任何历史原因?
【问题讨论】:
标签: sql sql-server tsql
来自ANSI-92 SQL Standard(搜索“SOME”)。 Also here, text
<some> ::= SOME | ANY
我怀疑原因是 SQL 语言起源于 1970 年代初期,但直到 1986 年才有标准。标准会采用现有 SQL 方言的元素,所以我们有这种 SOME/ANY 异常。
Brad Schulz 的这篇博客文章解释了一些差异:“ALL, ANY, and SOME: The Three Stooges”
【讨论】:
SOME 和 ANY 是等价的。 ANY 是 ANSI 语法。为什么要引入 SOME,我不知道。可能是因为可读性,但接下来的两句话都很容易理解。
WHERE 5000 < ANY(SELECT Price FROM dbo.items)
WHERE 5000 < SOME(SELECT Price FROM dbo.items)
虽然,SQL server 在这两种情况下都会执行:
WHERE EXISTS(SELECT * FROM dbo.items WHERE price>5000)
这也很容易理解。
【讨论】:
“它们具有相同功能有什么历史原因吗?”
我会回答实际的问题...一开始它只是 ALL 和 ANY。
ALL 是一个全称量词,而 ANY 应该始终是一个存在量词。但是,在英语中,ANY 也经常用作全称量词。 “我可以击败你们中的任何人”不是“我可以击败你们中的一些人”的同义词。它实际上是“我可以打败你们所有人”的同义词。
由于 ANY 令人困惑,随着采用 SQL-92 标准,SOME 被引入作为 ANY 的更可靠同义词。 ANY 应该保留一段时间,只是为了与以前的产品版本向后兼容。但我们今天仍然拥有它。
【讨论】:
SOME 和 ANY 在 SQL-92 标准中是等价的,因此虽然它没有回答您指出的问题,但它确实表明历史可以追溯到很久以前。
【讨论】:
请记住,一些数据库产品已经存在了近三年。 Oracle、IBM 和 Microsoft 等供应商一直在其产品中包含随后被纳入 ANSI 标准的功能。
有时这些功能是由多个供应商独立开发的,因此标准或供应商必须支持关键字的同义词。例如,Oracle 早在 ANSI 指定 SELECT UNIQUE 之前就有 SELECT DISTINCT。 Oracle 支持这两种用法。
我不知道类似情况是否适用于 SOME 和 ANY。但似乎很有可能。
【讨论】: