Ответ 1
Я сомневаюсь, что в SQLite есть оператор ALL(). Однако вы можете написать что-то функционально эквивалентное с помощью MAX() и MIN().
SELECT name
FROM table
WHERE number >= (SELECT MAX(another_number) FROM another_table WHERE ...)
Есть ли способ сделать следующее в SQLite?
select name
from table
where number >= ALL (<subquery, "such as select x from table ...">)
В частности, я получаю синтаксическую ошибку после оператора ALL
, независимо от того, как я отформатирую свой запрос. В моем поисковом рассылке для решения я нашел некоторое упоминание о том, что синтаксис для ALL
отличается в SQLite, но я не могу понять, что он понимает.
Может ли кто-нибудь показать мне, как базовый оператор ALL (<subquery>)
работает в SQLite? Или дайте мне знать, если они вообще не работают?
Я сомневаюсь, что в SQLite есть оператор ALL(). Однако вы можете написать что-то функционально эквивалентное с помощью MAX() и MIN().
SELECT name
FROM table
WHERE number >= (SELECT MAX(another_number) FROM another_table WHERE ...)
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 слева от оператора UNION ALL и все строки из SELECT справа от него. Оператор UNION работает так же, как и UNION ALL, за исключением того, что дублирующие строки удаляются из окончательного набора результатов.
SQLite не имеет оператора ALL. Возможно, у вас возникнет соблазн написать что-то вроде этого:
select ... where number >= (select max(...) from ...);
Однако во всех случаях это не эквивалентно исходному запросу. Если подзапрос не имеет результатов, то number
больше всех (vacuously true). Но максимум нулевых чисел равен NULL, а number >= NULL
является ложным (точнее, неизвестным в тройной логике, который в конце концов обрабатывается как false).
Следующий запрос эквивалентен запросу, использующему ВСЕ, в том числе для пустого случая:
select ... where not exists (select * from ... where number < X);