用于查找行的SQL查询

时间:2012-05-15 10:04:47

标签: sql database oracle

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

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

此处CD01已修复,CD01有一个空格后,数字会写入0001及以后。

请在此处看到CD01 0003CD01 0006CD01 0007丢失,这些是我要求的输出。

必需的输出:

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

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

2 个答案:

答案 0 :(得分: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函数使列看起来像您的主键(请参阅format model函数的TO_CHAR文档。)
  • 然后我将这些生成的值与您的实际表值进行比较(NOT IN是ANTI-JOIN)

答案 1 :(得分: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)