如何找出数据库中所有缺失的主键?现有查询仅能获取首个缺失ID
获取所有缺失主键ID及范围的SQL方案
原查询只能返回第一个缺失的主键ID,要获取所有缺失项,这里提供两种实用方案:
一、列出所有单个缺失的ID
适合主键范围较小的场景,通过生成连续ID序列对比原表找出缺失值:
WITH all_ids AS ( SELECT MIN(ogc_fid) AS start_id, MAX(ogc_fid) AS end_id FROM 你的表名 UNION ALL SELECT start_id + 1, end_id FROM all_ids WHERE start_id + 1 <= end_id ) SELECT a.start_id AS missing_id FROM all_ids a LEFT JOIN 你的表名 b ON a.start_id = b.ogc_fid WHERE b.ogc_fid IS NULL ORDER BY a.start_id;
把代码里的你的表名替换成实际表名即可。原理是先递归生成主键最小到最大值之间的所有连续ID,再通过左连接筛选出不在原表中的ID。
二、按连续范围显示缺失的ID(如200-500)
适合数据量大的场景,能把连续缺失的ID合并成范围,更直观高效:
WITH gaps AS ( SELECT ogc_fid + 1 AS gap_start, LEAD(ogc_fid) OVER (ORDER BY ogc_fid) - 1 AS gap_end FROM 你的表名 UNION ALL -- 可选:如果需要显示最大ID之后的缺失,保留这行;不需要则删除 SELECT MAX(ogc_fid) + 1, NULL FROM 你的表名 ), valid_gaps AS ( SELECT gap_start, gap_end FROM gaps WHERE gap_start <= gap_end OR gap_end IS NULL ) SELECT CASE WHEN gap_start = gap_end THEN CAST(gap_start AS VARCHAR) WHEN gap_end IS NULL THEN CAST(gap_start AS VARCHAR) + ' 及以上' ELSE CAST(gap_start AS VARCHAR) + ' - ' + CAST(gap_end AS VARCHAR) END AS missing_range FROM valid_gaps WHERE gap_start IS NOT NULL ORDER BY gap_start;
原理是用LEAD窗口函数获取下一个主键值,计算当前主键后的缺失区间;再过滤无效区间,最后把连续缺失格式化成易读的范围。
内容的提问来源于stack exchange,提问作者James
相关产品推荐
相关产品推荐

