Sql 错误:对于SELECT DISTINCT,ORDER BY表达式必须出现在选择列表中
我有一个表,我想从中查询按严重性列排序的记录。 严重性列包含值高、中、低 以下给定的查询给了我错误信息: 对于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 *
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;