单表查询报错:单行子查询返回多行,如何获取各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
相关产品推荐
相关产品推荐

