2016-10-28 4 views
1

Я создаю запрос для ориентированного на db webapp и сталкиваюсь с проблемой с SELECT DISTINCT и ORDER BY. Я хочу, чтобы первый отображаемый элемент определялся переменной (показывая, какая опция была выбрана пользователем ранее), а затем остальные должны сортироваться в обычном режиме. Мой ORDER BY работал отлично, прежде чем добавить параметр DISTINCT к выбору (необходимо устранить дубликаты). Сортируемые столбцы отображаются в моем SELECT, поэтому я не уверен, почему он не примет его."Элементы ORDER BY должны появиться в списке выбора, если указано SELECT DISTINCT"

WITH COURSE2 AS 
    (
    SELECT DISTINCT(SUBSTRING(section_table.crs_cde, 1, 10)) AS CRSID, yr_cde, trm_Cde FROM section_table 
    ) 
    SELECT DISTINCT crs_cde, crs_title 
     FROM course_table 
     LEFT JOIN COURSE2 
     ON crs_cde = CRSID 
     WHERE yr_cde = #currentyear# 
     AND trm_cde = #currentterm# 
     ORDER BY <cfif isDefined("FORM.ndd")>(case crs_cde when '#FORM.ndd#' then 0 else 1 end),</cfif> crs_cde ASC 

Цените любую и всяческую помощь :)

ответ

4

появляются столбцы, упорядоченные в мой ВЫБОР

Не совсем. Просто использование одного из тех же столбцов в операторе CASE не учитывается. Ссылка ORDER BY должна точно соответствовать списку SELECT. Один из вариантов - переместить CASE в список SELECT в качестве нового столбца. Затем сортировать по столбцу псевдоним:

SELECT DISTINCT crs_cde 
      , crs_title 
      , CASE crs_cde WHEN 'some value' THEN 0 ELSE 1 END AS SortOrder 

    FROM ... 
    ORDER BY SortOrder, crs_cde 

Пара других комментариев по поводу запроса:

WHERE yr_cde = #currentyear# AND trm_cde = #currentterm#

  1. Это вызовет запрос для преобразования в INNER JOIN. Если вам действительно нужно внешнее соединение, переместите эти фильтры в оператор CTE.

  2. Обязательно оберните ВСЕ переменные параметры в cfqueryparam. Использование необработанных переменных в запросах ставит базу данных под угрозу для SQL-инъекции.

  3. Для ясности и удобочитаемости рассмотрим добавление псевдонимов таблиц и их использование для префикса всех столбцов в запросе соединения.

  4. Scope все переменные, то есть использовать FORM.someField вместо просто someField

Собираем все вместе, что-то вроде этого (не проверено)

WITH COURSE2 AS 
(
    SELECT DISTINCT(SUBSTRING(crs_cde, 1, 10)) AS CRSID 
    FROM section_table 
    WHERE yr_cde = <cfqueryparam value="#FORM.currentYear#" cfsqltype="cf_sql_integer"> 
    AND trm_cde = <cfqueryparam value="#FORM.currentTerm#" cfsqltype="cf_sql_integer"> 
) 
SELECT DISTINCT ct.crs_cde 
     , ct.crs_title 
     <cfif structKeyExists(FORM, "ndd")> 
     , CASE ct.crs_cde 
       WHEN <cfqueryparam value="#FORM.ndd#" cfsqltype="cf_sql_varchar"> THEN 0 
       ELSE 1 
      END AS SortOrder 
     </cfif> 
FROM course_table ct LEFT JOIN COURSE2 c2 ON c2.CRSID = ct.crs_cde 
ORDER BY 
    <cfif structKeyExists(FORM, "ndd")>SortOrder,</cfif> 
    crs_cde ASC