2

我想在表中已有的记录之间插入一条记录。有超过 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 行,然后传输该表中的剩余数据。但我似乎无法弄清楚查询的语法。

提前致谢 :-)

4

2 回答 2

8

关系数据库中的行未排序

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

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

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

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

于 2012-05-02T08:47:45.407 回答
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 索引)以使您的查询更快

于 2012-05-02T08:51:03.190 回答