我想在表格中已有的记录之间插入记录。有超过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行,然后传输该表中的剩余数据。但我似乎无法弄清楚查询的语法。
提前致谢: - )
答案 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索引)以加快查询速度