Ошибка в конструкции select distinct выражения order by должны быть в списке выборки

Обновлено: 30.06.2024

При попытке использовать DISTINCT, а именно

При попытке использовать DISTINCT, а именно

При попытке использовать DISTINCT, а именно

Я даже объясню почему у вас проблема:
вот у вас в базе есть 2 строки с:
Куда именно надо сортировать "Field2"=foo? в начало списка или в конец списка?
Когда сможете ответить на это - тогда и сможете написать правильный запрос :).

У меня еще один вопрос, есть аналогичный запрос с LIMIT

Да в данном случае так и есть (в других случаях может быть по другому).

Ответ: для правила сортировки (ORDER BY CASE WHEN "Field2" = "Field3" THEN 1 ELSE 0 END)
сначала будет следовать запись (foo, bar), затем (foo / foo)

Далее выполняем SELECT-выборку поля Field2 (получаем две записи)
Далее выполняем DISTINCT "Field2" и получаем поле Field2 из первой полученной записи, т.е. из (foo, bar).

Потому что в SQL порядок выполнения операций другой. и ORDER BY делается в САМОМ КОНЦЕ (после него только LIMIT/OFFSET).
На момент ORDER BY в вашем запросе уже никакой информации о Field3 нет, у нас остался просто список уникальных Field2.

Следовательно, ORDER BY выполняется до SELECT-выборки и в т.ч. по полям, отсутствующим в предложении SELECT.
А это значит, что на момент ORDER BY есть информация не только о SELECT-полях, но и всех прочих полях записей (в частности, Field3)

Посмотрите план такого запроса и увидите, что сначала выполняется выборка, а потом уже сортировка, которой доступны не только перечисленные в SELECT поля потому, что выборка выбирает не поля, а записи целиком.

Т.е. сначала выбираем, потом сортируем и только после отдаем те поля, что перечислены в SELECT.

Но Maxim Boguk пишет:

автор
На момент ORDER BY в вашем запросе уже никакой информации о Field3 нет, у нас остался просто список уникальных Field2
Кто прав ?
Здравый смысл на нашей стороне, а вот PostgreSQL - на стороне Maxim Boguk.

причём так работают ВСЕ базы и это ANSI SQL стандарт нравиться вам это или нет.
И на то есть вполне чёткие причины почему так а не иначе.
После distinct остаются уже поля а не записи.

Тем более что требуемое вам поведение достаточно легко реализуется при желании в запросе.

Читайте также: