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

单表查询报错:单行子查询返回多行,如何获取各ID最大NULIGN记录?

获取每个ID的最后一条记录:解决子查询多行返回的错误

嘿,我明白你遇到的问题了——你的原语句之所以报错,是因为SELECT DISTINCT MAX(NULIGN) FROM TABLE1 GROUP BY ID这个子查询会返回多行结果(每个ID对应一个最大的NULIGN值),但你用了=运算符,它只能匹配单个值,所以数据库就抛出了"single-row subquery returns more than one row"的错误。

下面给你几种可行的解决方案,你可以根据自己的需求选择:

方法1:用IN替代=,同时匹配ID和最大NULIGN

直接把=换成IN还不够严谨(可能会出现不同ID有相同NULIGN最大值的情况),最好同时匹配ID和对应的最大NULIGN值:

SELECT * 
FROM TABLE1 
WHERE (ID, NULIGN) IN (SELECT ID, MAX(NULIGN) FROM TABLE1 GROUP BY ID);

这样就能精准定位到每个ID下NULIGN最大的那条记录了。

方法2:用窗口函数(推荐,可读性更强)

窗口函数是处理这类分组取最值场景的利器,用ROW_NUMBER()(或RANK()/DENSE_RANK())可以轻松实现需求:

WITH ranked_records AS (
    SELECT *,
           -- 按ID分组,每组内按NULIGN倒序排,给每条记录标序号
           ROW_NUMBER() OVER (PARTITION BY ID ORDER BY NULIGN DESC) AS rn
    FROM TABLE1
)
SELECT * 
FROM ranked_records 
WHERE rn = 1;
  • 如果你的表中存在多个ID下NULIGN相同且都是最大值的记录,ROW_NUMBER()会随机给它们分配不同的序号,只返回其中一条。
  • 要是想保留所有这些最大值的记录,把ROW_NUMBER()换成RANK()或者DENSE_RANK()就行,这样相同最大值的记录序号都会是1,都会被筛选出来。

方法3:用JOIN关联子查询结果

先查询每个ID的最大NULIGN,再通过JOIN和原表关联,也能得到目标数据:

SELECT t1.* 
FROM TABLE1 t1
JOIN (
    SELECT ID, MAX(NULIGN) AS max_nulign
    FROM TABLE1
    GROUP BY ID
) t2 ON t1.ID = t2.ID AND t1.NULIGN = t2.max_nulign;

这个方法的逻辑和方法1类似,只是用JOIN的方式实现,适合习惯用关联查询的场景。


内容的提问来源于stack exchange,提问作者Med Anis

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 06:52:07