在记录列表之间插入新记录

时间:2012-05-02 08:38:46

标签: sql oracle oracle11g

我想在表格中已有的记录之间插入记录。有超过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查询时我想要的是什么:

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行,然后传输该表中的剩余数据。但我似乎无法弄清楚查询的语法。

提前致谢: - )

2 个答案:

答案 0 :(得分:8)

关系数据库中的行未排序

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

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

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

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

答案 1 :(得分:3)

记录存储在表格中的方式没有隐含顺序。您可以在查询中使用排序按所需顺序查看列表。

您可以执行的操作是添加POSITION列(类型为NUMBER),该列指示列表中记录的位置。然后,如果要将记录插入列表的第n个位置,请执行以下操作:

UPDATE enum SET position = position + 1 WHERE position >= <desired nth position> 
INSERT INTO enum VALUES(<desired nth position>, ....)

按顺序查看列表:

SELECT * FROM enum ORDER BY position ASC

编辑并在POSITION列上添加索引(键入b-tree索引)以加快查询速度