Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

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

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

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 20.06.2018, 13:57   #1
polin11
Форумчанин
 
Регистрация: 07.06.2015
Сообщений: 164
По умолчанию Ошибка при использовании 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, 14:01   #2
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,238
По умолчанию

Код:
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, 12:10   #3
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,515
По умолчанию

Код:
(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 в 12:16.
evg_m вне форума Ответить с цитированием
Старый 21.06.2018, 17:45   #4
polin11
Форумчанин
 
Регистрация: 07.06.2015
Сообщений: 164
По умолчанию

Работает такой вариант
Код:
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 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Конфликт 'order by' в запросе, при использовании встроенной сортировки DBGridE KBO БД в Delphi 3 26.06.2018 11:35
Ошибка при использовании << dimon_snake Общие вопросы C/C++ 3 08.02.2016 21: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