4

mytable在 ORACLE 数据库中有一个表,只有一列Roll_no,如下所示:

Roll_no
----------
CD01 0001
CD01 0002
CD01 0004
CD01 0005
CD01 0008

这里CD01是固定的,在CD01一个空格之后,然后写数字,然后0001再写。

请在此处查看缺少CD01 0003, CD01 0006,CD01 0007这些是我需要的输出。

所需输出:

Roll_no
----------
CD01 0003
CD01 0006
CD01 0007

如何编写 SQL 查询来找出这些缺失的字母数字字符?请有任何想法

4

2 回答 2

5

您可以生成完整的数字列表,然后使用 NOT EXISTS(或 NOT IN)过滤掉现有记录。例如:

SELECT new_roll_no
  FROM (SELECT 'CD01 ' || to_char(rownum, 'fm0000') new_roll_no FROM dual 
        CONNECT BY LEVEL <= (SELECT to_number(MAX(substr(roll_no, 6))) FROM T))
 WHERE new_roll_no NOT IN (SELECT roll_no FROM T)
 ORDER BY 1

以下是它的工作原理:

  • CONNECT BY LEVEL 是一个有点技巧的查询,它会生成高达您指示的级别的行(在这种情况下,我从您的表中选择了最大值)。我认为这个查询首先出现在askTom网站上,现在已经很普遍了。
  • 我已经生成了 8 行,接下来我将使用 TO_CHAR 函数使列看起来像您的主键(请参阅TO_CHAR函数的格式模型文档)。
  • 然后,我将这些生成的值与您的实际表值进行比较(NOT IN 是 ANTI-JOIN)
于 2012-05-15T10:17:53.957 回答
1
select n
  from (select 'CD01' || to_char(rownum, '0009') n
          from dual
    connect by level <= (select max(substr(roll_no, 6)) from mytable))
where n not in (select roll_no from mytable)
于 2012-05-15T10:25:56.047 回答