SQL去除重复值:一对多关联时取主表每个No_对应的首条FG数据
问题描述
需要关联一对多关系的两个表,仅获取主表TableHeader中每个No_对应的从表TableLine的第一条FG数据。
当前使用的SQL语句:
select th.No_, tl.fg from TableHeader as th left join TableLine as tl on th.No_ = tl.[LineNo_]
期望结果为每个th.No_对应唯一的FG值,示例如下:
| Column NO | Column FG |
|---|---|
| CNOC008617 | FG092405 |
| NOC008630 | FG092353 |
| NOC007854 | FG092356 |
解决方案
通用方案(支持SQL Server、MySQL 8+、PostgreSQL等主流数据库)
使用ROW_NUMBER()窗口函数为每个主表No_对应的从表数据编号,筛选出编号为1的记录:
SELECT th.No_, tl.fg FROM TableHeader AS th LEFT JOIN ( SELECT [LineNo_], fg, ROW_NUMBER() OVER (PARTITION BY [LineNo_] ORDER BY (SELECT NULL)) AS rn -- 提示:若需要按特定逻辑确定"第一条"(如创建时间最早),将ORDER BY后的内容替换为实际字段,比如ORDER BY CreateDate ASC FROM TableLine ) AS tl ON th.No_ = tl.[LineNo_] AND tl.rn = 1
MySQL 5.x 兼容方案
如果使用不支持窗口函数的MySQL 5.x版本,可通过关联子查询筛选第一条记录:
SELECT th.No_, tl.fg FROM TableHeader AS th LEFT JOIN TableLine AS tl ON th.No_ = tl.[LineNo_] AND tl.id = (SELECT MIN(id) FROM TableLine WHERE [LineNo_] = th.No_) -- 这里假设TableLine有唯一主键id,也可替换为其他能确定排序的字段(如MIN(CreateTime))
SQL Server 简化方案
利用TOP 1 WITH TIES特性简化语句:
SELECT TOP 1 WITH TIES th.No_, tl.fg FROM TableHeader AS th LEFT JOIN TableLine AS tl ON th.No_ = tl.[LineNo_] ORDER BY ROW_NUMBER() OVER (PARTITION BY th.No_ ORDER BY (SELECT NULL))
内容的提问来源于stack exchange,提问作者ivonne
相关产品推荐
相关产品推荐

