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

多表关联查询优化:限制每个站点仅返回一条记录

解决站点关联查询仅返回单条记录的方案

嘿,我来帮你搞定每个站点只返回一条记录的问题~ 因为SWPPP_SITE和SWPPP_TRACKING是一对多关系,直接关联会把每个站点的所有跟踪记录都带出来,所以我们需要做一些处理来筛选出每个站点对应的单条跟踪记录,下面给你几种通用的解决方法:

方法1:聚合子查询关联(适合取特定聚合值的场景)

如果你需要每个站点对应的最新/最早/特定条件的跟踪记录,可以先通过子查询聚合出每个站点对应的目标跟踪记录ID,再关联回主表。比如下面的例子是取每个站点最新的跟踪记录(用跟踪表的OBJECTID最大值或者日期最大值判断都可以):

SELECT 
    s.OBJECTID AS SITE_OID,
    s.Site_Name AS SITE_Site_Name,
    s.Coordinates, -- 替换成你实际需要的站点字段
    cs.Status_Name, -- 状态表的对应字段
    t.Tracking_Date,
    t.Details -- 跟踪表的其他字段
FROM SWPPP_SITE s
-- 关联状态表(一对一关系,直接JOIN即可)
JOIN LKUP_CONSTRUCTION_STATUS cs ON s.Status_ID = cs.Status_ID 
-- 关联子查询:先拿到每个站点对应的最新跟踪记录ID
JOIN (
    SELECT Site_ID, MAX(OBJECTID) AS Latest_Tracking_OID
    FROM SWPPP_TRACKING
    GROUP BY Site_ID
) latest_t ON s.OBJECTID = latest_t.Site_ID
-- 再通过最新ID关联回跟踪表,拿到完整跟踪信息
JOIN SWPPP_TRACKING t ON latest_t.Latest_Tracking_OID = t.OBJECTID;

方法2:窗口函数排序筛选(灵活度最高)

用ROW_NUMBER()窗口函数给每个站点的跟踪记录排序,然后只保留每组的第一条记录,这种方法可以自定义排序规则(比如按跟踪日期倒序、按创建时间排序等),非常灵活:

WITH RankedTracking AS (
    SELECT 
        *,
        -- 按站点分组,按跟踪日期倒序排名,每个站点的第一条记录排名为1
        ROW_NUMBER() OVER (PARTITION BY Site_ID ORDER BY Tracking_Date DESC) AS rn
    FROM SWPPP_TRACKING
)
SELECT 
    s.OBJECTID AS SITE_OID,
    s.Site_Name AS SITE_Site_Name,
    s.Coordinates,
    cs.Status_Name,
    rt.Tracking_Date,
    rt.Details
FROM SWPPP_SITE s
JOIN LKUP_CONSTRUCTION_STATUS cs ON s.Status_ID = cs.Status_ID
-- 关联已经排好序的跟踪记录
JOIN RankedTracking rt ON s.OBJECTID = rt.Site_ID
-- 只保留每个站点排名第一的记录
WHERE rt.rn = 1;

如果想取最早的跟踪记录,把ORDER BY Tracking_Date DESC改成ASC就行,完全按需调整。

方法3:快速去重(适合无需指定规则的场景)

如果不在乎取哪条跟踪记录,只是单纯想每个站点返回一条,可以用数据库特定的去重语法,比如PostgreSQL的DISTINCT ON:

SELECT DISTINCT ON (s.OBJECTID)
    s.OBJECTID AS SITE_OID,
    s.Site_Name AS SITE_Site_Name,
    s.Coordinates,
    cs.Status_Name,
    t.Tracking_Date,
    t.Details
FROM SWPPP_SITE s
JOIN LKUP_CONSTRUCTION_STATUS cs ON s.Status_ID = cs.Status_ID
JOIN SWPPP_TRACKING t ON s.OBJECTID = t.Site_ID
-- 排序决定取哪条记录,这里按日期倒序取最新的
ORDER BY s.OBJECTID, t.Tracking_Date DESC;

SQL Server则可以用TOP 1 WITH TIES结合ORDER BY来实现类似效果。

你可以根据自己的业务需求选择对应的方法,比如需要明确取最新记录的话,方法1或2都是不错的选择~

内容的提问来源于stack exchange,提问作者Kevin R. M.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 08:33:14