“如果指定了SELECT DISTINCT,则ORDER BY项必须出现在选择列表中”

时间:2016-10-28 18:50:53

标签: sql database coldfusion sql-order-by distinct

我正在构建面向数据库的webapp的查询,并遇到SELECT DISTINCT和ORDER BY的问题。我希望显示的第一个项目由变量确定(显示用户之前选择的选项),然后其余部分正常排序。在将DISTINCT选项添加到select(需要消除重复项)之前,我的ORDER BY工作正常。正在排序的列出现在我的SELECT中,所以我不确定它为什么不接受它。

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

感谢所有帮助:)

1 个答案:

答案 0 :(得分:4)

  

正在排序的列出现在我的SELECT

不完全。只使用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. 范围所有变量,即使用FORM.someField而非someField

  5. 将所有内容放在一起,类似这样(未经测试)

    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