функция sql min и другой столбец для sqlite - PullRequest
1 голос
/ 22 марта 2019

Для sqlite я вижу, что такой запрос возвращает правильный результат:

CREATE TABLE users(id INTEGER PRIMARY KEY, 
                   user_id INTEGER NOT NULL, 
                   salary INTEGER NOT NULL);
insert into users (user_id, salary) values (1, 42000);
insert into users (user_id, salary) values (2, 39000);
insert into users (user_id, salary) values (3, 50000);
sqlite> SELECT user_id, MAX(salary) FROM users;
3|50000
sqlite> SELECT user_id, MIN(salary) FROM users;
2|39000

, но похоже на mysql, например, работает по-другому:

sql min functionи другой столбец

и return 1|50000.

Является ли это расширением sqlite или может быть неправильным в этом случае, и это стандартное поведение для реализации SQL?

1 Ответ

3 голосов
/ 22 марта 2019

Результат не"правильный" в SQLite. SQLite расширяет свои функциональные возможности для поддержки этих типов нестандартных запросов. Это явно расширение функциональности, и я бы этого не хотел.

Запросы нестандартные, поскольку в SELECT (id) есть неагрегированный столбец, но запрос является агрегирующим (из-за MIN() / MAX()). Более поздние версии MySQL с настройками по умолчанию правильно отклоняют этот запрос как не синтаксически правильный. Более старые версии MySQL возвращают значение id из произвольной строки. SQLite расширил определение SQL для этого особого случая и возвращает значение id, которое соответствует максимальной или минимальной зарплате.

В обеих базах данных лучший подход:

SELECT user_id, salary as max_salary
FROM users
ORDER BY salary DESC
LIMIT 1;

и

SELECT user_id, salary as min_salary
FROM users
ORDER BY salary ASC
LIMIT 1;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...