有一个表A,它有一个varchar(10)的字段,num; 内容如下:
A
001
002
003   //注意“004”,“005”没有。。
006
007
......
要求,能够把“004”给查出来。
如果把“004”插入后,则把“005”查询出来。
如果把“004”,“005”都插入后,那么应该把“008”查询出来。

解决方案 »

  1.   

    select isnull(min(right('000'+cast(cast(x.a as int)+1 as varchar(10)),3)),'001') as newA
    from a x left join a y
    on right('000'+cast(cast(x.a as int)+1 as varchar(10)),3)=y.a
    where y.a is null
      

  2.   

    DECLARE @t TABLE(A VARCHAR(10))
    INSERT @t SELECT '001'
    UNION ALL SELECT '002'
    UNION ALL SELECT '003'
    UNION ALL SELECT '006'
    UNION ALL SELECT '007'SELECT TOP 1 LEFT('00000',3-LEN(CAST(A AS INT) + 1))+RTRIM(CAST(A AS INT) + 1) FROM @t a WHERE NOT EXISTS(SELECT 1 FROM @t b WHERE CAST(a.A AS INT)+1=CAST(b.A AS INT))
      

  3.   

    不好意思,兄弟我愚钝,不明白LZ题意!
          
          帮LZ up ing。     做个记号先!
      

  4.   

    select min(cast(num as int)+1) from A where cast(num as int)+1 not in (select cast(num as int) from A)
      

  5.   

    select min(cast(num as int)+1) 
    from A t 
    where not exists(select cast(num as int) from A where cast(num as int)=cast(t.num as int)+1)
      

  6.   

    achongsky(灵魂)  有错误提示:
    服务器: 消息 208,级别 16,状态 1,行 1
    对象名 'A' 无效。
    服务器: 消息 208,级别 16,状态 1,行 1
    对象名 'A' 无效。
      

  7.   

    to:polly_110() 
    你的表名是A吗?数据库指定了没?
      

  8.   

    fcuandy(现在流行散分) 的原理是:用这张表自连接做查询把表中的每一个数据都加1,找出加1后的新行 在 原表中不存在的 那些记录行
    比如说,003加1 后应该是4,但是4在原表中不存在,那么Select出来的结果就是003加1,即004
      

  9.   

    to: achongsky(灵魂) 
    不好意思,我把一个字段搞错了。to: lzhs(快乐至上)
    谢谢你的解释,把查询的原理弄明白了,要不然,知道这个问题的代码怎么写,下次遇到了,却又不会了。
      

  10.   

    /*
    有一个表A,它有一个varchar(10)的字段,num; 内容如下:
    A
    001
    002
    003   //注意“004”,“005”没有。。
    006
    007
    ......
    要求,能够把“004”给查出来。
    如果把“004”插入后,则把“005”查询出来。
    如果把“004”,“005”都插入后,那么应该把“008”查询出来。
    */--YCZEALOT 20060816IF EXISTS (SELECT * FROM DBO.SYSOBJECTS WHERE ID=OBJECT_ID('T') AND XTYPE='U') DROP TABLE T
    CREATE TABLE T
    (
    V CHAR(8)
    )INSERT INTO T(v)
    SELECT '0001' UNION ALL
    SELECT '0002' UNION ALL
    SELECT '0004' UNION ALL
    SELECT '0006' UNION ALL
    SELECT '0007' UNION ALL
    SELECT '0009' IF EXISTS (SELECT * FROM TEMPDB.DBO.SYSOBJECTS WHERE ID=OBJECT_ID('TEMPDB..#T') AND XTYPE='U') DROP TABLE #T
    SELECT ID1=IDENTITY(INT,1,1),* INTO #T FROM T 
    SELECT TOP 1 CASE (LEN(CONVERT(INT,V))) WHEN 1 THEN '000'
    WHEN 2 THEN '00'
    WHEN 3 THEN '0'
    ELSE ''
    END
    +CONVERT(CHAR(1),ID1) AS V FROM #T WHERE ID1<>V/*
    --RESULT
    --0003
    */