left join 左表去重
时间: 2025-01-09 12:53:43 浏览: 1
### 如何在 SQL `LEFT JOIN` 中对左表进行去重
当执行 `LEFT JOIN` 操作时,如果希望去除左表中的重复记录,可以采用多种方法来实现这一目标。一种常见的方式是在查询中引入子查询或使用窗口函数。
#### 方法一:利用子查询消除重复项
通过创建一个不包含任何重复条目的临时结果集作为新的左表参与联接操作:
```sql
SELECT *
FROM (
SELECT DISTINCT column1, column2, ...
FROM tableA
) AS unique_tableA
LEFT JOIN tableB ON unique_tableA.columnX = tableB.columnY;
```
这种方法确保了即使原始的 `tableA` 存在冗余行,在最终的结果集中也不会有来自该侧的重复记录[^1]。
#### 方法二:应用窗口函数 ROW_NUMBER()
对于支持窗口函数(如 MySQL 8.0+ 版本),可以通过分配唯一编号给每组内的每一行并筛选出特定编号对应的行来进行去重:
```sql
WITH RankedTableA AS (
SELECT *,
ROW_NUMBER() OVER (PARTITION BY key_columns ORDER BY sort_column) as rn
FROM tableA
)
SELECT t.*
FROM RankedTableA t
JOIN tableB b ON t.key_columns = b.matching_key AND t.rn = 1;
```
此代码片段会为每个分区内按指定列排序后的首行赋予 `rn=1` 的标记,并仅保留这些被标记过的行用于后续联接操作[^4]。
需要注意的是,上述两种方案都假设存在能够区分不同记录的关键字段组合 (`key_columns`) 或者至少有一个可用于排序以决定哪些是“优先”的列(`sort_column`). 如果没有这样的依据,则可能难以定义什么是真正的“重复”。
阅读全文