Форум программистов
 
Контакты: о проблемах с регистрацией, почтой и по другим вопросам пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail.

Вернуться   Форум программистов > Web > SQL, базы данных
Регистрация

Восстановить пароль
Повторная активизация e-mail

Ответ
 
Опции темы
Старый 20.06.2018, 14:57   #1
polin11
Форумчанин
 
Регистрация: 07.06.2015
Сообщений: 96
Репутация: -53
По умолчанию Ошибка при использовании DISTINCT, ORDER BY и CASE

Есть запрос, он выполняется без ошибок, но есть дублирующие записи
Код:

SELECT  "Field2"  FROM "Table1" WHERE "Fileld1" LIKE 'val%'
ORDER BY  CASE WHEN "Field2" = "Field3" THEN 1 ELSE 0 END


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

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"
polin11 вне форума   Ответить с цитированием
Старый 20.06.2018, 15:01   #2
Serge_Bliznykov
МегаМодератор
СуперМодератор
 
Регистрация: 09.01.2008
Сообщений: 24,613
Репутация: 5352
По умолчанию

Код:

SELECT * FROM
(SELECT  DISTINCT "Field2"  FROM "Table1" WHERE "Fileld1" LIKE 'val%')
ORDER BY  CASE WHEN "Field2" = "Field3" THEN 1 ELSE 0 END

Serge_Bliznykov вне форума   Ответить с цитированием
Старый 21.06.2018, 13:10   #3
evg_m
Профессионал
 
Регистрация: 20.04.2008
Сообщений: 4,755
Репутация: 2097
По умолчанию

Код:

(SELECT  DISTINCT "Field2"  FROM "Table1" WHERE "Fileld1" LIKE 'val%')

теперь мы "потеряли" field3, и следующая сортировка потеряла смысл(она невозможна).
Код:

ORDER BY  CASE WHEN "Field2" = "Field3" THEN 1 ELSE 0 END

Код:

field2 field3
  1      1
  1      5
  2      5
  3      1
  3      7
  3      3

понятно что хотим получить 1, 2, 3 НО в каком порядке?...
(там есть как совпадение полей, так и их различие)
А может статься и получить-то в таком разе надо НЕЧТО другое.
__________________
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 21.06.2018 в 13:16.
evg_m на форуме   Ответить с цитированием
Старый 21.06.2018, 18:45   #4
polin11
Форумчанин
 
Регистрация: 07.06.2015
Сообщений: 96
Репутация: -53
По умолчанию

Работает такой вариант
Код:

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
Код:

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
polin11 вне форума   Ответить с цитированием
Ответ

Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Конфликт 'order by' в запросе, при использовании встроенной сортировки DBGridE KBO БД в Delphi 3 26.06.2018 12:35
Ошибка при использовании << dimon_snake Общие вопросы C/C++ 3 08.02.2016 22:09
Ошибка при использовании vfprintf в dll при stdout CHERTS Visual C++ 1 25.10.2013 15:18
Ошибка при использовании темплейта optimator Общие вопросы C/C++ 5 06.10.2011 14:44
Ошибка при использовании CreateProcess Sadowod Общие вопросы Delphi 7 20.08.2010 17:43


11:36.


Powered by vBulletin® Version 3.8.8 Beta 2
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.

RusProfile.ru


Справочник российских юридических лиц и организаций.
Проекты отопления, пеллетные котлы, бойлеры, радиаторы
интернет магазин respective.ru