You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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 NOColumn FG
CNOC008617FG092405
NOC008630FG092353
NOC007854FG092356
解决方案

通用方案(支持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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 06:25:09