在Oracle SQL中,如果想去除重复记录而不使用`DISTINCT`关键字,一种常见的做法是使用`GROUP BY`语句结合聚合函数(比如`MAX()`, `MIN()`, 或简单的 `ROW_NUMBER()` 与窗口函数)。具体选择哪种方法取决于你的具体需求,比如是否需要保留特定的行作为代表。
### 使用`GROUP BY`
如果你只关心去重后的某列或某几列的值,而不关心行内的其他列具体是哪个值,可以使用`GROUP BY`结合聚合函数。
例如,假设你有一个`employees`表,里面有`id`, `name`, 和 `department`列,你想要去除`name`和`department`相同的重复记录:
SELECT MAX(id) AS id, name, department
FROM employees
GROUP BY name, department;
这里使用`MAX(id)`只是作为一个示例,你可以根据需要选择`MIN(id)`或其他聚合函数。注意,这将为每组`name`和`department`相同的记录选择一个`id`(在本例中是最大的那个)。
### 使用`ROW_NUMBER()`窗口函数
如果你需要基于某种排序来选择每组的唯一记录,`ROW_NUMBER()`是一个很好的选择。例如,基于`id`升序排列,保留每组中的第一条记录:
WITH RankedEmployees AS (
SELECT
id,
name,
department,
ROW_NUMBER() OVER (PARTITION BY name, department ORDER BY id ASC) AS rn
FROM employees
)
SELECT id, name, department
FROM RankedEmployees
WHERE rn = 1;
这个查询中,`ROW_NUMBER()`为每个`name`和`department`相同的分组内的行分配了一个唯一的序号(按`id`升序),然后外部查询通过`WHERE rn = 1`选择了每组中的第一条记录。