【问题标题】:"ORDER BY items must appear in the select list if SELECT DISTINCT is specified"“如果指定了 SELECT DISTINCT,则 ORDER BY 项目必须出现在选择列表中”
【发布时间】:2016-10-28 18:50:53
【问题描述】:

我正在为面向 db 的 webapp 构建查询,但遇到了 SELECT DISTINCT 和 ORDER BY 的问题。我希望显示的第一个项目由变量确定(显示用户先前选择的选项),然后正常排序其余项目。在我将 DISTINCT 选项添加到选择之前,我的 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

感谢所有帮助:)

【问题讨论】:

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


    【解决方案1】:

    正在排序的列出现在我的 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
    

    关于查询的其他几个 cmets:

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

    1. 这将导致查询转换为INNER JOIN。如果您确实需要外连接,请将这些过滤器移到 CTE 语句中。

    2. 确保将所有变量参数包装在 cfqueryparam 中。在查询中使用原始变量会使数据库面临 sql 注入的风险。

    3. 为了清晰和可读性,考虑添加表别名并使用它们作为连接查询中所有列的前缀。

    4. 作用于所有变量,即使用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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-12-14
      • 2023-03-20
      相关资源
      最近更新 更多