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

如何在SQL Server中查询Article表的未使用ID列表

在SQL Server中查询Article表未使用的可用ID列表

我们的Article表中id字段为numeric(5,0),取值范围是1到99999,需要找出所有未被使用的ID,以下是两种可行的实现方案:

方案一:生成全量ID后筛选未使用项

通过递归CTE生成1到99999的所有可能ID,再与Article表左连接,筛选出无匹配记录的ID:

WITH AllPossibleIDs AS (
    SELECT 1 AS ID
    UNION ALL
    SELECT ID + 1
    FROM AllPossibleIDs
    WHERE ID < 99999
)
SELECT ap.ID AS AvailableID
FROM AllPossibleIDs ap
LEFT JOIN Article a ON ap.ID = a.id
WHERE a.id IS NULL
OPTION (MAXRECURSION 0); -- 递归次数超过默认100,需开启此选项

方案二:基于现有ID的间隙生成可用ID

先找出现有ID之间的空缺区间,再生成区间内的所有ID,适合ID分布较密集的场景,性能更优:

WITH ExistingIDs AS (
    SELECT id FROM Article
    UNION ALL
    SELECT 0 -- 处理从1开始的空缺
    UNION ALL
    SELECT 100000 -- 处理最大ID到99999的空缺
),
IDGaps AS (
    SELECT 
        curr.id + 1 AS StartGap,
        next.id - 1 AS EndGap
    FROM ExistingIDs curr
    JOIN ExistingIDs next ON next.id > curr.id
    WHERE NOT EXISTS (
        SELECT 1 FROM ExistingIDs e WHERE e.id > curr.id AND e.id < next.id
    )
    AND curr.id + 1 <= next.id - 1
),
AvailableIDs AS (
    SELECT StartGap AS ID
    FROM IDGaps
    UNION ALL
    SELECT ID + 1
    FROM AvailableIDs a
    JOIN IDGaps g ON a.ID >= g.StartGap AND a.ID < g.EndGap
)
SELECT ID AS AvailableID
FROM AvailableIDs
ORDER BY ID
OPTION (MAXRECURSION 0);

方案选择建议

  • 如果表中ID分布稀疏,方案一实现简单直接;
  • 如果表中ID分布密集,方案二仅针对空缺区间生成ID,性能更高效。

内容的提问来源于stack exchange,提问作者Laurens Wolf

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 08:35:19