sql - "ORDER BY items must appear in the select list if SELECT DISTINCT is specified"

标签 sql database coldfusion sql-order-by distinct

我正在为面向数据库的 Web 应用程序构建查询,并遇到了 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

感谢所有帮助:)

最佳答案

The columns being sorted appear in my SELECT

不完全是。仅在 CASE 语句中使用相同的列之一不算数。 ORDER BY 引用必须与 SELECT 列表完全匹配。一种替代方法是将 CASE 作为新列移动到 SELECT 列表中。然后按 alias 列排序:

  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 注入(inject)的风险。

  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

关于sql - "ORDER BY items must appear in the select list if SELECT DISTINCT is specified",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40311467/

相关文章:

sql - C:遍历 SQLite 记录并将每个值分配给变量

mysql - MySQL 中何时使用单引号、双引号和反引号

mysql - 需要一个想法来设计用于诊所预约安排的数据库 : "A doctor is working in multiple clinics in different timings"

arrays - ColdFusion 相当于 JavaScript 数组切片函数吗?

c# - TSQL:使用 INSERT INTO SELECT FROM 进行更新

sql - 查询以查找子字符串的所有匹配行

php - 尝试让 INSERT 仅插入新数据

database - Redshift 光谱 - 更新外部光谱表列类型

javascript - jQuery 事件注册从 FORM 范围 <ColdFusion> 取消定义元素

coldfusion - 将 PHP 代码转换为 Coldfusion