Oracle 查询使用DISTINCT报错不是selected表达式
在 Oracle 数据库中,我们经常会用到 DISTINCT
关键字去除结果集中的重复行。然而,有时候当我们在查询中使用 DISTINCT
时,却会碰到一个错误:“ORA-01791:not a SELECTed expression”。
这个错误的原因是由于在 DISTINCT
关键字后使用了不能出现在 SELECT
列表中的表达式。这意味着在 SELECT
列表和 DISTINCT
关键字之间存在一些不符合规范的内容导致了错误的发生。
下面我们来详细分析这个问题,并介绍解决这个错误的方法。
问题分析
当我们在 Oracle 中执行查询语句,例如:
SELECT DISTINCT column1, column2, column3
FROM table_name;
在这个查询中,我们想要返回 table_name
表中去除重复行后的结果集。然而,如果 column1
的计算方式为一个表达式,而非直接引用数据库中的列,例如:
SELECT DISTINCT (column1 + column2), column3
FROM table_name;
那么就会导致 ORA-01791 错误的发生,因为 (column1 + column2)
不是一个在 SELECT
列表中被选择的表达式。
解决方法
为了解决这个问题,我们需要将不能在 SELECT
列表中出现的表达式放到子查询中,然后在外部使用 DISTINCT
关键字。
我们可以通过以下方法来解决这个问题:
SELECT DISTINCT expr.column1, expr.column3
FROM (
SELECT (column1 + column2) as column1, column3
FROM table_name
) expr;
在这个解决方法中,我们首先在子查询中计算了 (column1 + column2)
表达式,并将其取别名为 column1
,然后在外层查询中使用 DISTINCT
对这个结果集进行去重。
示例
假设我们有一个名为 employees
的表,包含了员工的姓名和工资信息,我们想要找出工资不重复的员工及其对应的部门。如果我们直接使用包含表达式的 DISTINCT
查询会报错:
SELECT DISTINCT (salary + bonus) as total_pay, department
FROM employees;
运行以上查询会得到如下报错信息:
ORA-01791: not a SELECTed expression
为了解决这个问题,我们可以使用以下查询语句:
SELECT DISTINCT expr.total_pay, expr.department
FROM (
SELECT (salary + bonus) as total_pay, department
FROM employees
) expr;
通过这样的查询方式,我们就成功避免了 ORA-01791 错误的发生,并得到了我们想要的结果。
结论
在使用 Oracle 数据库进行查询时,如果遇到了 “ORA-01791:not a SELECTed expression” 的错误,应该首先检查查询中是否有不符合规范的表达式被放到了 DISTINCT
关键字之后。通过将这些表达式放到子查询中,然后在外层查询中使用 DISTINCT
进行去重,可以有效解决这个问题。