在Oracle数据库里有一张表student,它的no字段存放1到64中任意若干数字,现在要写sql语句来实现1到64个数字中未被student表no字段占用的数字。请高手帮我看看,急用!
如:假设student有如下记录:
 id      no      name
----    -----   ------
 1       5       Bob
 2       18      Jane
 3       56      Sam
 4       34      Jessi用sql语句返回的结果应该为1到64中除去5、18、56、34的所有数字

解决方案 »

  1.   

    新建一个表,插入1-64。
    然后两表内连接,取不在student表中的no。
      

  2.   

    如果是oracle10g,则用
    select * from
    (select rownum rn from dual connect by rownum<65) r
    where not exists
    (select 1
      from students t
      where r.rn=t.no)
    order by rn;
      

  3.   

     
    --------------- 测试数据
    CREATE TABLE student
    (
    ID NUMBER,
    NO NUMBER,
    BOB VARCHAR2(10)
    );
    INSERT INTO STUDENT VALUES (1    ,  5    ,  'Bob'  );
    INSERT INTO STUDENT VALUES (2    ,  18   ,  'Jane');
    INSERT INTO STUDENT VALUES (3    ,  56   ,  'Sam' );
    INSERT INTO STUDENT VALUES (4    ,  34   ,  'Jessi');
    COMMIT;--------------- SQL
    SELECT R.RN
      FROM (SELECT ROWNUM AS RN
              FROM ALL_OBJECTS T
             WHERE ROWNUM <= 64) R  --- 1到64个数字
     WHERE NOT EXISTS (SELECT NO
              FROM STUDENT S
             WHERE S.NO = R.RN)
     ORDER BY R.RN
    ------------- 结果
    RN
    1
    2
    3
    4
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    57
    58
    59
    60
    61
    62
    63
    64