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

如何通过SQL从两张表中找出最小的缺失数字?

解决两张表中查找最小缺失数字的问题

问题场景

现有两张表:

  • bidder表的bidder_number字段(对应示例的Table1 columna)包含值1,2,3,8(且auctionid=1)
  • customer表的permanent_biddernumber字段(对应示例的Table2 columnb)包含值4,10,11
    需要找出最小的缺失数字,期望结果为5。

原代码仅能返回下一个可用数字(如12),核心问题是候选缺失值的范围覆盖不全——原代码只基于bidder表的相邻数值生成候选(如4、9),但未覆盖5-7这类既不在bidder也不在customer的中间区间。

修正后的SQL方案

方案一:生成全量候选值筛选

WITH AllNumbers AS (
    -- 合并两张表的所有有效正整数,去重
    SELECT bidder_number AS num 
    FROM bidder 
    WHERE auctionid = 1 AND bidder_number > 0
    UNION
    SELECT permanent_biddernumber AS num 
    FROM customer 
    WHERE permanent_biddernumber > 0 AND permanent_biddernumber IS NOT NULL
),
MissingCandidates AS (
    -- 候选缺失值:包含1(处理1缺失的情况),以及所有已有数字+1
    SELECT 1 AS candidate
    UNION ALL
    SELECT num + 1 AS candidate FROM AllNumbers
)
-- 筛选不在合并集合中的候选值,取最小的
SELECT MIN(candidate) AS lowest_missing_value
FROM MissingCandidates
WHERE candidate NOT IN (SELECT num FROM AllNumbers);

方案二:基于存在值的缺失判断

WITH AllNumbers AS (
    SELECT bidder_number AS num 
    FROM bidder 
    WHERE auctionid = 1 AND bidder_number > 0
    UNION
    SELECT permanent_biddernumber AS num 
    FROM customer 
    WHERE permanent_biddernumber > 0 AND permanent_biddernumber IS NOT NULL
)
SELECT COALESCE(
    -- 找第一个"存在数字+1"不在集合中的值
    (SELECT MIN(num + 1) FROM AllNumbers WHERE num + 1 NOT IN (SELECT num FROM AllNumbers)),
    -- 若所有数字连续,检查1是否缺失,否则返回最大值+1
    (SELECT CASE WHEN MIN(num) > 1 THEN 1 ELSE MAX(num) + 1 END FROM AllNumbers)
) AS lowest_missing_value;

逻辑说明

  1. AllNumbers:将两张表的有效正整数合并去重,统一作为参考集合。
  2. 候选值覆盖:通过包含1和所有存在数字+1,确保所有可能的缺失点都被纳入筛选范围,避免遗漏中间区间。
  3. 最终筛选:从候选值中找出第一个不在参考集合中的数字,即为最小缺失值。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 18:47:15