我想在表中已有的记录之间插入一条记录。有超过40000个记录,我想将此新记录放在第19位。我该怎么办?

让我们考虑一个包含5条记录的示例:

表格数据:

CREATE TABLE enum
  (identifier  VARCHAR2(64),
   code VARCHAR2(512),
   data VARCHAR2(4000))
/
INSERT ALL
INTO enum VALUES ('HR_B_A', 'Halli, L6', 'Halli, L6')
INTO enum VALUES ('HR_B_A', 'Halli, L7', 'Halli, L7')
INTO enum VALUES ('HR_B_A', 'Halli, L8', 'Halli, L8')
INTO enum VALUES ('HR_B_A', 'Halli, L9', 'Halli, L9')
INTO enum VALUES ('HR_B_A', 'Halli, P6', 'Halli, P6')
INTO enum VALUES ('HR_B_A', 'Halli, P7', 'Halli, P7')
select * from dual
/


因此,当我们检查表格时,我们得到:

SELECT * FROM enum

IDENTIFIER     CODE         DATA
----------   ---------    ---------
HR_B_A       Halli, L6    Halli, L6
HR_B_A       Halli, L7    Halli, L7
HR_B_A       Halli, L8    Halli, L8
HR_B_A       Halli, L9    Halli, L9
HR_B_A       Halli, P6    Halli, P6
HR_B_A       Halli, P7    Halli, P7


运行选择查询时,我希望拥有什么:

SELECT * from enum

IDENTIFIER     CODE         DATA
    ----------   ---------    ---------
    HR_B_A       Halli, L6    Halli, L6
    HR_B_A       Halli, L7    Halli, L7
    HR_B_A       Halli, L8    Halli, L8
    HR_B_A       Halli, L9    Halli, L9
    HR_B_A       Halli, L10   Halli, L10
    HR_B_A       Halli, P6    Halli, P6
    HR_B_A       Halli, P7    Halli, P7


我能想到的唯一方法是将数据传输到表中的L9行(例如enum_temp),插入L10行,然后传输该表中的剩余数据。但是我似乎无法弄清楚查询的语法。

提前致谢 :-)

最佳答案

关系数据库中的行未排序

除非您在SELECT中使用ORDER BY表达式,否则无法确保任何所需的顺序。

当您在值中混合几种类型的“信息”时,您将需要使用以下内容:

select *
from enum
order by regexp_replace(code, '[0-9]', ''),
         to_number(regexp_replace(code, '[^0-9]', ''))


表达式的第一阶按不包含数字的代码部分进行排序。这样,所有Halli, L值将一起排序。然后,按表达式的第二个顺序按代码的数字值排序(所有非数字字符都剥离)。

关于sql - 在记录列表之间插入新记录,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/10410328/

10-09 08:50
查看更多