Синтаксис SQLite для "ALL"

Есть ли способ сделать следующее в SQLite?

select name
from   table
where  number >= ALL (<subquery, "such as select x from table ...">)

В частности, я получаю синтаксическую ошибку после оператора ALL, независимо от того, как я отформатирую свой запрос. В моем поисковом рассылке для решения я нашел некоторое упоминание о том, что синтаксис для ALL отличается в SQLite, но я не могу понять, что он понимает.

Может ли кто-нибудь показать мне, как базовый оператор ALL (<subquery>) работает в SQLite? Или дайте мне знать, если они вообще не работают?

Ответ 1

Я сомневаюсь, что в SQLite есть оператор ALL(). Однако вы можете написать что-то функционально эквивалентное с помощью MAX() и MIN().

SELECT name 
FROM table 
WHERE number >= (SELECT MAX(another_number) FROM another_table WHERE ...)

Ответ 2

SQLite имеет ключевое слово ALL; но он не делает то, что вы хотите. (К счастью, ответ @lawrence делает.)

Пока ключевое слово ALL недопустимо как часть выражения WHERE, ключевое слово может появиться в нескольких других местах.

Из http://www.sqlite.org/lang_select.html:

ВЫБЕРИТЕ ВСЕ *...

Одно из ключевых слов ALL или DISTINCT может следовать за ключевым словом SELECT в простой инструкции SELECT. Если простой SELECT является SELECT ALL, тогда весь набор строк результатов возвращается SELECT. Если не присутствуют ни ALL, ни DISTINCT, тогда поведение будет таким, как если бы было указано ALL.

SELECT... UNION ALL SELECT...

Соединение SELECT, созданное с помощью оператора UNION ALL, возвращает все строки из SELECT слева от оператора UNION ALL и все строки из SELECT справа от него. Оператор UNION работает так же, как и UNION ALL, за исключением того, что дублирующие строки удаляются из окончательного набора результатов.

Ответ 3

SQLite не имеет оператора ALL. Возможно, у вас возникнет соблазн написать что-то вроде этого:

select ... where number >= (select max(...) from ...);

Однако во всех случаях это не эквивалентно исходному запросу. Если подзапрос не имеет результатов, то number больше всех (vacuously true). Но максимум нулевых чисел равен NULL, а number >= NULL является ложным (точнее, неизвестным в тройной логике, который в конце концов обрабатывается как false).

Следующий запрос эквивалентен запросу, использующему ВСЕ, в том числе для пустого случая:

select ... where not exists (select * from ... where number < X);