用于查找行的SQL查询

sar*_*roj 4 sql database oracle

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

Roll_no
----------
CD01 0001
CD01 0002
CD01 0004
CD01 0005
CD01 0008
Run Code Online (Sandbox Code Playgroud)

这里CD01是固定的,在有CD01一个空格后,然后写入数字0001.

请在这里看到CD01 0003,CD01 0006,CD01 0007失踪,这些都是我需要的输出.

所需输出:

Roll_no
----------
CD01 0003
CD01 0006
CD01 0007
Run Code Online (Sandbox Code Playgroud)

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

Vin*_*rat 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
Run Code Online (Sandbox Code Playgroud)

以下是它的工作原理:

  • CONNECT BY LEVEL是一个技巧查询,它会生成你指定的级别的行(在这种情况下,我从表中选择了最大值).我认为这个查询最初出现在askTom网站上,现在相当普遍.
  • 我已生成8行,接下来我将使用TO_CHAR函数使列看起来像您的主键(请参阅TO_CHAR函数的格式模型文档).
  • 然后我将这些生成的值与您的实际表值进行比较(NOT IN是ANTI-JOIN)