Oracle 查询使用DISTINCT报错不是selected表达式

Oracle 查询使用DISTINCT报错不是selected表达式

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 进行去重,可以有效解决这个问题。

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程