【问题标题】:How to find a gap in range in SQL如何在 SQL 中查找范围内的空白
【发布时间】:2013-07-22 07:55:00
【问题描述】:

This question 解释了如何在表中找到第一个“未使用”的数字,但我怎样才能找到相同的数字以便我可以定义额外的约束。如何更改查询,以便获得大于 100 的第一个未使用的数字

例如如果我的表中有 23、56、100、101、103,我应该得到 102。

【问题讨论】:

  • 包含where mo.id > 100 条件(在接受的答案中的任何查询中)。
  • 您使用的是哪个 DBMS?后格雷斯?甲骨文?
  • 目前我正在使用 SQLite,但很可能稍后会迁移到 PostgreSQL。

标签: sql sqlite postgresql gaps-and-islands


【解决方案1】:

在 mysql 和 postgresql 中

SELECT  id + 1
FROM    test mo
WHERE   NOT EXISTS
        (
        SELECT  NULL
        FROM    test mi 
        WHERE   mi.id = mo.id + 1
        ) and mo.id> 100
ORDER BY
        id
LIMIT 1

fiddle for mysqlfiddle for postgresql

在 ms sql 中

SELECT  TOP 1
        id + 1
FROM    test mo
WHERE   NOT EXISTS
        (
        SELECT  NULL
        FROM    test mi 
        WHERE   mi.id = mo.id + 1
        )
          and mo.id > 100
ORDER BY
        id

fiddle

【讨论】:

    【解决方案2】:

    在Oracle Sql中,你可以试试:

    SELECT id
    FROM
         (SELECT ID, lead(ID) OVER(ORDER BY ID) next_val FROM my_table t
         )
    WHERE id +1 <> next_val
     AND id      >100;
    

    【讨论】:

    • 这实际上不是 Oracle 特定的。它使用标准的 ANSI SQL 窗口函数,该函数也适用于 Postgres、SQL Server 2012、DB2 和许多其他现代 DBMS。
    【解决方案3】:

    希望对你有帮助

    SELECT MIN (id) + 1
      FROM myTable T1
     WHERE id >= 100
       AND NOT EXISTS (SELECT *
                         FROM myTable T2
                        WHERE T1.id + 1 = T2.id)
    

    【讨论】:

    • 工作得很好,除非 id 101 是免费的并且第一个被占用的 1000,我会因为一些奇怪的原因得到 1001....
    • 在这种情况下,您必须将“id > 100”替换为“id >= 100”,如查询所示
    【解决方案4】:

    使用 generate_series() 获得乐趣和利润:

    CREATE table islands (num INTEGER NOT NULL PRIMARY KEY);
    
    INSERT INTO islands (num ) VALUES
    (23), (56), (100), (101), (103) ;
    
    WITH total AS (
            SELECT generate_series(mima.bot, mima.top) AS num
            FROM ( SELECT MIN(num) AS bot , MAX(num) AS top FROM islands) mima
            )
    SELECT num
    FROM total tt
    WHERE num >=100
    AND NOT EXISTS (
            SELECT *
            FROM islands ii
            WHERE ii.num = tt.num
            )
            ;
    

    【讨论】:

      【解决方案5】:

      使用这个:

      SELECT TOP 1 a1.id + 1 FROM test a1 left JOIN test a2 
      ON a1.id = a2.id - 1 
      WHERE a2.id IS NULL AND a1.id > 100
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-08-15
        • 1970-01-01
        • 1970-01-01
        • 2022-12-16
        相关资源
        最近更新 更多