powered by simpleCommunicator - 2.0.40     © 2025 Programmizd 02
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Ошибка при использовании DISTINCT, ORDER BY и CASE
12 сообщений из 12, страница 1 из 1
Ошибка при использовании DISTINCT, ORDER BY и CASE
    #39663027
polin11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Есть запрос, он выполняется без ошибок, но есть дублирующие записи
Код: sql
1.
2.
SELECT  "Field2"  FROM "Table1" WHERE "Fileld1" LIKE 'val%'
ORDER BY  CASE WHEN "Field2" = "Field3" THEN 1 ELSE 0 END



При попытке использовать DISTINCT, а именно
Код: sql
1.
2.
SELECT  DISTINCT "Field2"  FROM "Table1" WHERE "Fileld1" LIKE 'val%'
ORDER BY  CASE WHEN "Field2" = "Field3" THEN 1 ELSE 0 END



возникает проблема: в конструкции SELECT DISTINCT выражения ORDER BY должны быть в списке выборки
не могу сообразить, как избавиться от дублей "Field2"
...
Рейтинг: 0 / 0
Ошибка при использовании DISTINCT, ORDER BY и CASE
    #39663034
Фотография Павел Воронцов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
polin11Есть запрос, он выполняется без ошибок, но есть дублирующие записи
Код: sql
1.
2.
SELECT  "Field2"  FROM "Table1" WHERE "Fileld1" LIKE 'val%'
ORDER BY  CASE WHEN "Field2" = "Field3" THEN 1 ELSE 0 END




При попытке использовать DISTINCT, а именно
Код: sql
1.
2.
SELECT  DISTINCT "Field2"  FROM "Table1" WHERE "Fileld1" LIKE 'val%'
ORDER BY  CASE WHEN "Field2" = "Field3" THEN 1 ELSE 0 END




возникает проблема: в конструкции SELECT DISTINCT выражения ORDER BY должны быть в списке выборки
не могу сообразить, как избавиться от дублей "Field2"

Код: sql
1.
2.
SELECT  DISTINCT "Field2"  FROM (SELECT "Field2", CASE WHEN "Field2" = "Field3" THEN 1 ELSE 0 END as ord FROM "Table1" WHERE "Fileld1" LIKE 'val%') a
ORDER BY  a.ord

?
...
Рейтинг: 0 / 0
Ошибка при использовании DISTINCT, ORDER BY и CASE
    #39663300
Фотография Maxim Boguk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
polin11Есть запрос, он выполняется без ошибок, но есть дублирующие записи
Код: sql
1.
2.
SELECT  "Field2"  FROM "Table1" WHERE "Fileld1" LIKE 'val%'
ORDER BY  CASE WHEN "Field2" = "Field3" THEN 1 ELSE 0 END



При попытке использовать DISTINCT, а именно
Код: sql
1.
2.
SELECT  DISTINCT "Field2"  FROM "Table1" WHERE "Fileld1" LIKE 'val%'
ORDER BY  CASE WHEN "Field2" = "Field3" THEN 1 ELSE 0 END



возникает проблема: в конструкции SELECT DISTINCT выражения ORDER BY должны быть в списке выборки
не могу сообразить, как избавиться от дублей "Field2"

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

--
Maxim Boguk
dataegret.ru
...
Рейтинг: 0 / 0
Ошибка при использовании DISTINCT, ORDER BY и CASE
    #39663759
polin11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Работает такой вариант
Код: sql
1.
2.
3.
4.
 SELECT "Field2" FROM 
 (SELECT DISTINCT "Field2",  CASE WHEN "Field2" = "Field3" THEN 1 ELSE 0  END as Ord  
 FROM "Table1" WHERE "Field1" LIKE 'val%'
 ORDER BY Ord DESC ) T 



У меня еще один вопрос, есть аналогичный запрос с LIMIT
Код: sql
1.
2.
3.
4.
 SELECT "Field2" FROM 
 (SELECT DISTINCT "Field2",  CASE WHEN "Field2" = "Field3" THEN 1 ELSE 0  END as Ord  
 FROM "Table1" WHERE "Field1" LIKE 'val%'
 ORDER BY Ord DESC LIMIT 20 ) T 



поправьте меня, если я не прав, при выполнении запроса планировщик пробежит ВСЕ записи, выполнит поиск по условию "Field1" LIKE 'val%', затем отсортирует по Ord и выдаст первые 20 записей, то есть по времени и ресурсам будет аналогично, этому же запросу, но без LIMIT 20
...
Рейтинг: 0 / 0
Ошибка при использовании DISTINCT, ORDER BY и CASE
    #39663800
Фотография Maxim Boguk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
polin11У меня еще один вопрос, есть аналогичный запрос с LIMIT
Код: sql
1.
2.
3.
4.
 SELECT "Field2" FROM 
 (SELECT DISTINCT "Field2",  CASE WHEN "Field2" = "Field3" THEN 1 ELSE 0  END as Ord  
 FROM "Table1" WHERE "Field1" LIKE 'val%'
 ORDER BY Ord DESC LIMIT 20 ) T 



поправьте меня, если я не прав, при выполнении запроса планировщик пробежит ВСЕ записи, выполнит поиск по условию "Field1" LIKE 'val%', затем отсортирует по Ord и выдаст первые 20 записей, то есть по времени и ресурсам будет аналогично, этому же запросу, но без LIMIT 20

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

--
Maxim Boguk
dataegret.ru
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
Ошибка при использовании DISTINCT, ORDER BY и CASE
    #40085952
Cyrax_02
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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).
...
Рейтинг: 0 / 0
Ошибка при использовании DISTINCT, ORDER BY и CASE
    #40085953
Cyrax_02
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Далее возникает вопрос: в чём заключается логическая ошибка вот такого запроса, чтобы он генерировал ошибку:

Код: sql
1.
2.
SELECT  DISTINCT "Field2"  FROM "Table1" WHERE "Fileld1" LIKE 'val%'
ORDER BY  CASE WHEN "Field2" = "Field3" THEN 1 ELSE 0 END
...
Рейтинг: 0 / 0
Ошибка при использовании DISTINCT, ORDER BY и CASE
    #40086001
Фотография Maxim Boguk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cyrax_02,

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

--
Maxim Boguk
лучшая поддержка PostgreSQL: dataegret.ru
...
Рейтинг: 0 / 0
Ошибка при использовании DISTINCT, ORDER BY и CASE
    #40086037
Cyrax_02
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Maxim BogukПотому что в SQL порядок выполнения операций другой... и ORDER BY делается в САМОМ КОНЦЕ (после него только LIMIT/OFFSET).
На момент ORDER BY в вашем запросе уже никакой информации о Field3 нет, у нас остался просто список уникальных Field2.Из ваших слов следует, что ORDER BY выполняется после SELECT и только по SELECT-полям.
Но это не так, иначе бы невозможно было выполнить запрос вида:
Код: sql
1.
SELECT field1 FROM ... ORDER BY field2


Следовательно, ORDER BY выполняется до SELECT-выборки и в т.ч. по полям, отсутствующим в предложении SELECT.
А это значит, что на момент ORDER BY есть информация не только о SELECT-полях, но и всех прочих полях записей (в частности, Field3 )
...
Рейтинг: 0 / 0
Ошибка при использовании DISTINCT, ORDER BY и CASE
    #40086041
Ы2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cyrax_02
Код: sql
1.
SELECT field1 FROM ... ORDER BY field2


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


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

Т.е. сначала выбираем, потом сортируем и только после отдаем те поля, что перечислены в SELECT.
...
Рейтинг: 0 / 0
Ошибка при использовании DISTINCT, ORDER BY и CASE
    #40086053
Cyrax_02
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ы2Посмотрите план такого запроса и увидите, что сначала выполняется выборка, а потом уже сортировка, которой доступны не только перечисленные в SELECT поля потому, что выборка выбирает не поля, а записи целиком .
Т.е. сначала выбираем, потом сортируем и только после отдаем те поля, что перечислены в SELECT. Так и я о том же.

Но Maxim Boguk пишет:автор На момент ORDER BY в вашем запросе уже никакой информации о Field3 нет , у нас остался просто список уникальных Field2Кто прав ?
Здравый смысл на нашей стороне, а вот PostgreSQL - на стороне Maxim Boguk ...
...
Рейтинг: 0 / 0
Ошибка при использовании DISTINCT, ORDER BY и CASE
    #40086092
Фотография Maxim Boguk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
...
Рейтинг: 0 / 0
12 сообщений из 12, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Ошибка при использовании DISTINCT, ORDER BY и CASE
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]