|
Ошибка при использовании DISTINCT, ORDER BY и CASE
|
|||
---|---|---|---|
#18+
Есть запрос, он выполняется без ошибок, но есть дублирующие записи Код: sql 1. 2.
При попытке использовать DISTINCT, а именно Код: sql 1. 2.
возникает проблема: в конструкции SELECT DISTINCT выражения ORDER BY должны быть в списке выборки не могу сообразить, как избавиться от дублей "Field2" ... |
|||
:
Нравится:
Не нравится:
|
|||
20.06.2018, 13:55 |
|
Ошибка при использовании DISTINCT, ORDER BY и CASE
|
|||
---|---|---|---|
#18+
polin11Есть запрос, он выполняется без ошибок, но есть дублирующие записи Код: sql 1. 2.
При попытке использовать DISTINCT, а именно Код: sql 1. 2.
возникает проблема: в конструкции SELECT DISTINCT выражения ORDER BY должны быть в списке выборки не могу сообразить, как избавиться от дублей "Field2" Код: sql 1. 2.
? ... |
|||
:
Нравится:
Не нравится:
|
|||
20.06.2018, 14:04 |
|
Ошибка при использовании DISTINCT, ORDER BY и CASE
|
|||
---|---|---|---|
#18+
polin11Есть запрос, он выполняется без ошибок, но есть дублирующие записи Код: sql 1. 2.
При попытке использовать DISTINCT, а именно Код: sql 1. 2.
возникает проблема: в конструкции SELECT DISTINCT выражения ORDER BY должны быть в списке выборки не могу сообразить, как избавиться от дублей "Field2" Я даже объясню почему у вас проблема: вот у вас в базе есть 2 строки с: Код: plaintext 1. 2. 3.
Когда сможете ответить на это - тогда и сможете написать правильный запрос :). -- Maxim Boguk dataegret.ru ... |
|||
:
Нравится:
Не нравится:
|
|||
20.06.2018, 22:37 |
|
Ошибка при использовании DISTINCT, ORDER BY и CASE
|
|||
---|---|---|---|
#18+
Работает такой вариант Код: sql 1. 2. 3. 4.
У меня еще один вопрос, есть аналогичный запрос с LIMIT Код: sql 1. 2. 3. 4.
поправьте меня, если я не прав, при выполнении запроса планировщик пробежит ВСЕ записи, выполнит поиск по условию "Field1" LIKE 'val%', затем отсортирует по Ord и выдаст первые 20 записей, то есть по времени и ресурсам будет аналогично, этому же запросу, но без LIMIT 20 ... |
|||
:
Нравится:
Не нравится:
|
|||
21.06.2018, 17:45 |
|
Ошибка при использовании DISTINCT, ORDER BY и CASE
|
|||
---|---|---|---|
#18+
polin11У меня еще один вопрос, есть аналогичный запрос с LIMIT Код: sql 1. 2. 3. 4.
поправьте меня, если я не прав, при выполнении запроса планировщик пробежит ВСЕ записи, выполнит поиск по условию "Field1" LIKE 'val%', затем отсортирует по Ord и выдаст первые 20 записей, то есть по времени и ресурсам будет аналогично, этому же запросу, но без LIMIT 20 Да в данном случае так и есть (в других случаях может быть по другому). -- Maxim Boguk dataegret.ru ... |
|||
:
Нравится:
Не нравится:
|
|||
21.06.2018, 19:55 |
|
Ошибка при использовании DISTINCT, ORDER BY и CASE
|
|||
---|---|---|---|
#18+
Maxim BogukЯ даже объясню почему у вас проблема: вот у вас в базе есть 2 строки с: "Field2" "Field3" foo foo foo bar Куда именно надо сортировать "Field2"=foo? в начало списка или в конец списка? Когда сможете ответить на это - тогда и сможете написать правильный запрос :). Здесь нужно ставить вопрос не о том, куда сортировать поле (Field2"=foo), а о том, куда сортировать записи (foo / foo) и (foo, bar) Сортируются ведь записи, а не поля. Ответ : для правила сортировки ( ORDER BY CASE WHEN "Field2" = "Field3" THEN 1 ELSE 0 END ) сначала будет следовать запись (foo, bar), затем (foo / foo) Далее выполняем SELECT-выборку поля Field2 (получаем две записи) Далее выполняем DISTINCT "Field2" и получаем поле Field2 из первой полученной записи, т.е. из (foo, bar). ... |
|||
:
Нравится:
Не нравится:
|
|||
24.07.2021, 18:53 |
|
Ошибка при использовании DISTINCT, ORDER BY и CASE
|
|||
---|---|---|---|
#18+
Далее возникает вопрос: в чём заключается логическая ошибка вот такого запроса, чтобы он генерировал ошибку: Код: sql 1. 2.
... |
|||
:
Нравится:
Не нравится:
|
|||
24.07.2021, 18:55 |
|
Ошибка при использовании DISTINCT, ORDER BY и CASE
|
|||
---|---|---|---|
#18+
Cyrax_02, Потому что в SQL порядок выполнения операций другой... и ORDER BY делается в САМОМ КОНЦЕ (после него только LIMIT/OFFSET). На момент ORDER BY в вашем запросе уже никакой информации о Field3 нет, у нас остался просто список уникальных Field2. -- Maxim Boguk лучшая поддержка PostgreSQL: dataegret.ru ... |
|||
:
Нравится:
Не нравится:
|
|||
25.07.2021, 11:14 |
|
Ошибка при использовании DISTINCT, ORDER BY и CASE
|
|||
---|---|---|---|
#18+
Maxim BogukПотому что в SQL порядок выполнения операций другой... и ORDER BY делается в САМОМ КОНЦЕ (после него только LIMIT/OFFSET). На момент ORDER BY в вашем запросе уже никакой информации о Field3 нет, у нас остался просто список уникальных Field2.Из ваших слов следует, что ORDER BY выполняется после SELECT и только по SELECT-полям. Но это не так, иначе бы невозможно было выполнить запрос вида: Код: sql 1.
Следовательно, ORDER BY выполняется до SELECT-выборки и в т.ч. по полям, отсутствующим в предложении SELECT. А это значит, что на момент ORDER BY есть информация не только о SELECT-полях, но и всех прочих полях записей (в частности, Field3 ) ... |
|||
:
Нравится:
Не нравится:
|
|||
25.07.2021, 14:00 |
|
Ошибка при использовании DISTINCT, ORDER BY и CASE
|
|||
---|---|---|---|
#18+
Cyrax_02 Код: sql 1.
Следовательно, ORDER BY выполняется до SELECT-выборки и в т.ч. по полям, отсутствующим в предложении SELECT. А это значит, что на момент ORDER BY есть информация не только о SELECT-полях, но и всех прочих полях записей (в частности, Field3 ) Посмотрите план такого запроса и увидите, что сначала выполняется выборка, а потом уже сортировка, которой доступны не только перечисленные в SELECT поля потому, что выборка выбирает не поля, а записи целиком. Т.е. сначала выбираем, потом сортируем и только после отдаем те поля, что перечислены в SELECT. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.07.2021, 14:47 |
|
Ошибка при использовании DISTINCT, ORDER BY и CASE
|
|||
---|---|---|---|
#18+
Ы2Посмотрите план такого запроса и увидите, что сначала выполняется выборка, а потом уже сортировка, которой доступны не только перечисленные в SELECT поля потому, что выборка выбирает не поля, а записи целиком . Т.е. сначала выбираем, потом сортируем и только после отдаем те поля, что перечислены в SELECT. Так и я о том же. Но Maxim Boguk пишет:автор На момент ORDER BY в вашем запросе уже никакой информации о Field3 нет , у нас остался просто список уникальных Field2Кто прав ? Здравый смысл на нашей стороне, а вот PostgreSQL - на стороне Maxim Boguk ... ... |
|||
:
Нравится:
Не нравится:
|
|||
25.07.2021, 15:51 |
|
Ошибка при использовании DISTINCT, ORDER BY и CASE
|
|||
---|---|---|---|
#18+
Cyrax_02, Хотите подробный и по пунткам разбор https://blog.jooq.org/2018/07/13/how-sql-distinct-and-order-by-are-related/ причём так работают ВСЕ базы и это ANSI SQL стандарт нравиться вам это или нет... И на то есть вполне чёткие причины почему так а не иначе. После distinct остаются уже поля а не записи. Тем более что требуемое вам поведение достаточно легко реализуется при желании в запросе. -- Maxim Boguk лучшая поддержка PostgreSQL: dataegret.ru ... |
|||
:
Нравится:
Не нравится:
|
|||
25.07.2021, 20:51 |
|
|
start [/forum/topic.php?fid=53&msg=39663800&tid=1993928]: |
0ms |
get settings: |
11ms |
get forum list: |
14ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
28ms |
get topic data: |
10ms |
get forum data: |
3ms |
get page messages: |
45ms |
get tp. blocked users: |
1ms |
others: | 266ms |
total: | 384ms |
0 / 0 |