您好我正在尝试在一个sql中进行多次更新和插入。
我有一个表格,我在其中加载具有以下列的数据:
此表是数据的历史表视图。行号是给定开始和结束时段的行数1到数字记录的数量。这意味着,如果它包含1980年的100条记录,则该时间段的结果为1到100。
如果记录3从2014年4月1日到结束时已被删除,那么记录3号后的所有记录都需要将其rownumber减少1以确保rownumber没有间隙。此外,这反过来意味着我们需要拆分所有记录,这样当您在2014年4月1日之前查看表格时,您会看到100行。但是在看到99行之后的任何时候。这实质上意味着将记录4-100的结束时间更新为2014年3月31日,并从2014年4月1日开始插入新记录,直到插入的时间结束为副本,即数据与rownumber减少1的数据相同
现在我想避免进行许多单独的更新和插入。即每个90 + x 2。我希望通过一个单独的SQL或少于90左右的智能方式。
我正在思考
Update table set rownumber=rownumber -1 where rownumber > 3 (Deleted rownumber)
当然这个例子不处理时间分割和插入
我在oracle 11g下运行。 我不能改变表结构要么我必须保持行号一致并且在一段时间内没有间隙。此表中也有任何更新或插入。
非常感谢任何建议提示。
答案 0 :(得分:1)
将rownum存储在表中是一种糟糕的编程习惯。 而不是存储它..更新你的表结构来删除rownum列,你需要检索它只需添加伪列名称rownum。 所以
select rownum, <column list> from <table name>
将做同样的工作。并且您不需要每次都更新。
直到除非你特别需要存储rownum列,否则不要为它创建一个列。
请指定需要存储rownum列的用例.. ??
然后我可以帮助你。
在用户发表评论后进行修改:
使用以下语句进行rownum更新:
update table t1 set rownum_col=(select rn from (select rownum rn, pk1 , pk2 from table ) t2 where t1.pk1=t2.pk1 and t1.pk2=t2.pk2);
答案 1 :(得分:0)
我不确定我是否理解有关拆分行的部分,但要对所有行进行顺序编号,您可以使用以下内容:
merge into the_table
using
(
select rowid as rid,
row_number() over (order by start_date) as new_rownumber
from the_table
) t on (t.rid = the_table.rowid)
when matched then update
set rownumber = new_rownumber;
如果rownumber不是&#34;全球&#34;在整个表中,您需要向窗口函数添加partition by
子句,以重新启动不同&#34;块的编号。数据。