Sql 错误:对于SELECT DISTINCT,ORDER BY表达式必须出现在选择列表中

Sql 错误:对于SELECT DISTINCT,ORDER BY表达式必须出现在选择列表中,sql,postgresql,Sql,Postgresql,我有一个表,我想从中查询按严重性列排序的记录。 严重性列包含值高、中、低 以下给定的查询给了我错误信息: 对于SELECT DISTINCT,ORDER BY表达式必须出现在选择列表中 使用子查询: SELECT * FROM ( SELECT DISTINCT * FROM Vulnerabilities vuln WHERE lower(dsc) LIKE '%tomcat%' ) sub ORDER BY CASE severity

我有一个表,我想从中查询按严重性列排序的记录。 严重性列包含值高、中、低

以下给定的查询给了我错误信息:

对于SELECT DISTINCT,ORDER BY表达式必须出现在选择列表中

使用子查询:

SELECT *
FROM  (
   SELECT DISTINCT *
   FROM   Vulnerabilities vuln 
   WHERE  lower(dsc) LIKE '%tomcat%'
   ) sub
ORDER  BY CASE severity 
            WHEN 'High'   THEN 1 
            WHEN 'Medium' THEN 2 
            WHEN 'Low'    THEN 3 
          END;
或使“按表达式排序”成为“选择”列表的一部分:

但有可能的是,你根本不想要清晰的。比如,这只适用于完全重复,这是一种罕见的情况,并且只有在您没有定义任何像PK这样的唯一列的情况下才有可能

可能是冗余噪声。或者,您的示例可能是一个更复杂查询的简化,或者您确实希望仅对几个选定列按/DISTINCT进行分组。对于后者,以下是一个更有用的相关答案:

关于DISTINCT ON的基础知识:

使用子查询:

SELECT *
FROM  (
   SELECT DISTINCT *
   FROM   Vulnerabilities vuln 
   WHERE  lower(dsc) LIKE '%tomcat%'
   ) sub
ORDER  BY CASE severity 
            WHEN 'High'   THEN 1 
            WHEN 'Medium' THEN 2 
            WHEN 'Low'    THEN 3 
          END;
或使“按表达式排序”成为“选择”列表的一部分:

但有可能的是,你根本不想要清晰的。比如,这只适用于完全重复,这是一种罕见的情况,并且只有在您没有定义任何像PK这样的唯一列的情况下才有可能

可能是冗余噪声。或者,您的示例可能是一个更复杂查询的简化,或者您确实希望仅对几个选定列按/DISTINCT进行分组。对于后者,以下是一个更有用的相关答案:

关于DISTINCT ON的基础知识:


从中选择不同的vuln。。。vuln在您的表中是否有一个名为vuln的列,或者您是否正在尝试选择表中的所有列?建议的副本不是一个好的选择。它是针对SQL Server的,语法不是100%适用于Postgres。它也不处理SELECT*。选择与…不同的vuln。。。vuln在您的表中是否有一个名为vuln的列,或者您是否正在尝试选择表中的所有列?建议的副本不是一个好的选择。它是针对SQL Server的,语法不是100%适用于Postgres。它也不涉及SELECT*。SELECT DISTINCT*没有真正意义,因为*将包括PK列,因此根据定义,DISTINCT不会删除重复项,但如果存在PK,则问题中的DISTINCT用法没有真正意义,但这只是一个假设。这回答了所提出的问题。为了解决这些问题,我添加了更多内容。重要的一点是,这是可行的:通过mycl从mytable order中选择distinct mycl;但事实并非如此:通过uppermycol从mytable order中选择distinct mycol;尽管这些确实感谢@ErwinBrandstetter:select*from select distinct mycl from mytable t order by uppert.mycl;按uppermycol从mytable顺序选择distinct mycol、uppermycol;这真的只是Postgres的愚蠢,因为在这种情况下,没有很好的理由说明order by子句应该在select列表中,而其他DBMS不需要它。@Arnnweinberg:用于实现不同排序的算法之一,根据select对表进行排序,并保留每组重复的第一行。对结果进行不同的排序需要另一个排序步骤。这就是使用子查询和上面演示的另一个顺序所做的。旁白:您可以使用DISTINCT ON子句中的DISTINCT ON-after表达式将任何表达式附加到ORDER BY,并且完全独立于SELECT列表。我在上面关于DISTINCT的主要答案中添加了一个链接。选择DISTINCT*没有真正意义,因为*将包括PK列,因此根据定义,DISTINCT不会删除重复项,但是问题中的DISTINCT用法没有真正意义,如果有PK,但这只是一个假设。这回答了所提出的问题。为了解决这些问题,我添加了更多内容。重要的一点是,这是可行的:通过mycl从mytable order中选择distinct mycl;但事实并非如此:通过uppermycol从mytable order中选择distinct mycol;尽管这些确实感谢@ErwinBrandstetter:select*from select distinct mycl from mytable t order by uppert.mycl;按uppermycol从mytable顺序选择distinct mycol、uppermycol;这真的只是Postgres的愚蠢,因为在这种情况下,没有很好的理由说明order by子句应该在select列表中,而其他DBMS不需要它。@Arnnweinberg:用于实现不同排序的算法之一,根据select对表进行排序,并保留每组重复的第一行。对结果进行不同的排序需要另一个排序步骤。这就是使用子查询和上面演示的另一个顺序所做的。旁白:您可以使用DISTINCT ON子句中的DISTINCT ON-after表达式将任何表达式附加到ORDER BY,并且完全独立于SELECT列表。我在上面添加了关于DISTINCT的主要答案的链接。
SELECT DISTINCT
       CASE severity 
           WHEN 'High'   THEN 1 
           WHEN 'Medium' THEN 2 
           WHEN 'Low'    THEN 3 
       END AS severity_order, *
FROM   Vulnerabilities vuln 
WHERE  lower(dsc) LIKE '%tomcat%'
ORDER  BY 1;