查询表中各ID对应最大Other ID的可编辑SQL语句
嘿,这个问题我太熟悉了!之前用MAX加JOIN的时候也踩过同样的坑——那种查询返回的是聚合后的虚拟结果集,不是直接来自基表的记录,自然没法编辑。给你两个靠谱的解决方案,都能返回可编辑的原表行:
方案1:使用窗口函数(推荐,支持多数现代数据库)
用ROW_NUMBER()窗口函数给每个ID分组内的行按Other ID降序排序,然后筛选出每组排名第一的行,这样返回的是原表的完整记录,完全支持编辑:
SELECT t.ID, t.[Other ID] FROM ( SELECT ID, [Other ID], -- 按ID分组,组内按Other ID从大到小排名 ROW_NUMBER() OVER (PARTITION BY ID ORDER BY [Other ID] DESC) AS row_rank FROM 你的表名 ) t WHERE t.row_rank = 1
如果你的数据里存在同一个ID有多个相同的最大Other ID的情况,ROW_NUMBER()会随机选一个;要是想保留所有并列最大值的行,可以把ROW_NUMBER()换成RANK()。
方案2:关联子查询(兼容老版本数据库)
如果你的数据库不支持窗口函数(比如一些老版本的SQL Server、Access),可以用关联子查询定位每个ID的最大Other ID,再关联回原表获取整行数据:
SELECT t.ID, t.[Other ID] FROM 你的表名 t WHERE t.[Other ID] = ( SELECT MAX([Other ID]) FROM 你的表名 WHERE ID = t.ID )
这个方案的特点是:如果同一个ID有多个相同的最大Other ID,会返回所有这些行;如果你的业务里不会出现这种情况,用这个完全没问题,而且返回的都是原表的可编辑行。
为什么之前的JOIN方案不可编辑?
你之前写的查询大概是类似这样的:
SELECT t.ID, max_o.max_other_id FROM 你的表名 t JOIN ( SELECT ID, MAX([Other ID]) AS max_other_id FROM 你的表名 GROUP BY ID ) max_o ON t.ID = max_o.ID
这种查询返回的是基表和聚合子查询的连接结果,其中max_other_id是聚合计算出来的虚拟字段,不是原表的原生字段,所以整个结果集是不可更新的视图。而上面的两个方案都是直接筛选原表的行,所以能正常编辑其他字段。
内容的提问来源于stack exchange,提问作者Nick
相关产品推荐
相关产品推荐

