TSQL - НЕКОТОРЫЕ | ЛЮБОЕ, почему они одинаковы с разными именами?

В соответствии с описанием MSDN BOL (Books Online) на НЕКОТОРЫЕ | ЛЮБОЙ (Transact-SQL),

НЕКОТОРЫЕ И ЛЮБЫЕ эквиваленты.

Имеет смысл использовать либо НЕКОТОРЫЕ | ЛЮБОЙ, чтобы сделать запрос более читаемым.

Но заключается в том, что единственная причина, по которой есть 2 ключевых слова в TSQL, где они служат точно такой же цели?

Есть ли исторические причины, по которым у них одинаковые функции?

Ответы

Ответ 1

Из ANSI-92 SQL Standard (найдите "НЕКОТОРЫЕ" ). Также здесь, текст

<some> ::= SOME | ANY

Я подозреваю, что причина в том, что язык SQL появился с начала 1970-х годов, но не имел стандарта до 1986 года. Стандарт принял бы элементы существующих диалектов SQL, поэтому у нас есть эта НЕКОТОРНАЯ/ЛЮБАЯ аномалия.

В этой статье в блоге Брэда Шульца объясняются некоторые отличия: " ВСЕ, ЛЮБЫЕ И НЕКОТОРЫЕ: Три Stooges"

Ответ 2

НЕКОТОРЫЕ И ЛЮБЫЕ эквивалентны. ANY - синтаксис ANSI. Почему НЕКОТОРЫЕ введены, я не знаю. Может быть из-за удобочитаемости, но оба следующих двух предложения легко понять.

WHERE 5000 < ANY(SELECT Price FROM dbo.items)
WHERE 5000 < SOME(SELECT Price FROM dbo.items)

Хотя SQL-сервер в обоих случаях будет выполняться:

WHERE EXISTS(SELECT * FROM dbo.items WHERE price>5000)

что также очень легко понять.

Ответ 3

"Есть ли исторические причины, по которым у них одинаковые функциональные возможности?"

Я отвечу на реальный вопрос... Сначала это было ВСЕ, ЛЮБОЕ.

ALL является универсальным квантором, а ANY должен всегда быть квантором существования. Однако на английском языке ANY часто используется как универсальный квантификатор. "Я могу победить ЛЮБОГО из вас" - это не синоним "Я могу победить НЕКОТОРЫХ из вас". Это на самом деле синоним "Я могу победить ВСЕХ из вас".

С ЛЮБОЙ запутанностью, НЕКОТОРЫЙ был введен как более надежный синоним ЛЮБОГО с принятием стандарта SQL-92. ЛЮБОЙ должен был оставаться на некоторое время только для обратной совместимости с предыдущими версиями продукта. Но у нас все еще есть это сегодня.

Ответ 4

НЕКОТОРЫЕ И ЛЮБОЙ эквивалентны в стандарте SQL-92, поэтому, хотя он не отвечает на ваш вопрос, чтобы указать на это, это указывает на то, что история прошла долгий путь.

Ответ 5

Помните, что некоторые продукты баз данных существуют почти три десятилетия. Поставщики, такие как Oracle, IBM и Microsoft, всегда включали функции в свои продукты, которые впоследствии были включены в стандарт ANSI.

Иногда эти функции были разработаны несколькими поставщиками самостоятельно, поэтому либо стандарт, либо поставщик должны были поддерживать синонимы ключевых слов. Например, Oracle имел SELECT DISTINCT задолго до того, как ANSI указал SELECT UNIQUE. Oracle поддерживает оба использования.

Я не знаю, применяется ли аналогичный сценарий в случае НЕКОТОРЫХ и ЛЮБЫХ. Но это кажется вероятным.