Странная ошибка «неправильного использования агрегата: max ()» в SQLite - PullRequest
0 голосов
/ 30 апреля 2018

У меня есть таблица SQLite с очень простой структурой:

CREATE TABLE `test` ( `id` INTEGER, `val` TEXT )

Я хочу выбрать только максимальный идентификатор, где val значение поля равно строке "test_id":

SELECT max(id) AS test_id FROM test WHERE val = "test_id"  // (1)

Обратите внимание, что я использую строку " test_id " в WHERE и test_id в качестве имени пользовательского столбца. Я получаю ошибку:

misuse of aggregate: max(): SELECT max(id) AS test_id FROM test WHERE val = "test_id"

Если я изменю max(id) AS test_id на max(id) AS test_id2 или WHERE val = "test_id" на WHERE val = "test_id_something" - все работает.

В MySQL у меня нет ошибок с оригинальным SELECT (1) . Исправленные версии работают хорошо. Что я делаю не так? Разве нельзя использовать тот же текст в WHERE и в качестве имени столбца в SQLite?

Ответы [ 2 ]

0 голосов
/ 30 апреля 2018

В SQL двойные кавычки используются для обозначения имен столбцов / таблиц, а test_id действительно является именем столбца. Строки разделяются одинарными кавычками:

SELECT max(id) AS test_id FROM test WHERE val = 'test_id'

SQLite допускает двойные кавычки для строк, чтобы быть совместимым с ошибками с MySQL, но в случае сомнений он должен выбрать стандартную интерпретацию.

0 голосов
/ 30 апреля 2018

Вы ответили на свой вопрос

Если я изменяю max (id) AS test_id на max (id) AS test_id2 или WHERE val = "test_id" на WHERE val = "test_id_something" - все работает.

WHERE val = "test_id" ссылки max(id) AS test_id. вам нужно использовать разные имена. попробуйте это

SELECT max(id) AS max_id FROM test WHERE val = "some_value"

misuse of aggregate: max(): является нормальным результатом использования агрегатных функций (AVG, COUNT, MIN, MAX, SUM ...) в предложении WHERE

http://sqlfiddle.com/#!7/b28b3/11

...