【问题标题】:TSQL - SOME | ANY why are they same with different names?TSQL - 一些 |任何为什么它们相同但名称不同?
【发布时间】:2010-11-25 22:05:47
【问题描述】:

根据SOME | ANY (Transact-SQL) 上的 MSDN BOL (Books Online) 描述,

SOME 和 ANY 是等价的。

使用 SOME | 中的任何一个都有意义。 ANY 使查询更具可读性。

但是唯一的原因,为什么 TSQL 中有 2 个关键字用于完全相同的目的?

它们具有相同功能是否有任何历史原因?

【问题讨论】:

    标签: sql sql-server tsql


    【解决方案1】:

    来自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

    【讨论】:

    • @gbn 我真的很喜欢“所有、任何和一些:三个傀儡”的文章。谢谢。
    • 'ANSI-92 SQL Standard' 链接已失效
    【解决方案2】:

    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)
    

    这也很容易理解。

    【讨论】:

    • 嗨,Niikola:“为什么要引入 SOME,我不知道”。这就是这个问题的重点。
    • 我试图找到这些运算符存在的原因。正如你的例子,我发现下面的查询更具可读性。
    【解决方案3】:

    “它们具有相同功能有什么历史原因吗?”

    我会回答实际的问题...一开始它只是 ALL 和 ANY。

    ALL 是一个全称量词,而 ANY 应该始终是一个存在量词。但是,在英语中,ANY 也经常用作全称量词。 “我可以击败你们中的任何人”不是“我可以击败你们中的一些人”的同义词。它实际上是“我可以打败你们所有人”的同义词。

    由于 ANY 令人困惑,随着采用 SQL-92 标准,SOME 被引入作为 ANY 的更可靠同义词。 ANY 应该保留一段时间,只是为了与以前的产品版本向后兼容。但我们今天仍然拥有它。

    【讨论】:

    • 语义,但我想说,在您的示例中,“任何”仍然与“全部”截然不同:“any of you”很可能意味着“任何[一个]你们(一次)”,不是“你们所有人(一次)”。无论如何都赞成,因为我同意可能存在歧义,尤其是对于那些不像我那样过度分析的人。 :)
    • @Nearoo - 我的最后一段说为什么历史上令人困惑的 ANY 已被 SOME 取代。
    【解决方案4】:

    SOME 和 ANY 在 SQL-92 标准中是等价的,因此虽然它没有回答您指出的问题,但它确实表明历史可以追溯到很久以前。

    【讨论】:

      【解决方案5】:

      请记住,一些数据库产品已经存在了近三年。 Oracle、IBM 和 Microsoft 等供应商一直在其产品中包含随后被纳入 ANSI 标准的功能。

      有时这些功能是由多个供应商独立开发的,因此标准或供应商必须支持关键字的同义词。例如,Oracle 早在 ANSI 指定 SELECT UNIQUE 之前就有 SELECT DISTINCT。 Oracle 支持这两种用法。

      我不知道类似情况是否适用于 SOME 和 ANY。但似乎很有可能。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-01-09
        • 2013-08-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-08-27
        • 1970-01-01
        • 2014-06-16
        相关资源
        最近更新 更多