【发布时间】:2014-05-07 06:48:07
【问题描述】:
您好,我目前正在尝试在一个 sql 中进行多次更新和插入。
我有一个表,我在其中加载具有以下列的数据:
- 行号
- 开始日期
- 结束日期
- 其他数据列
此表是数据的历史表视图。行号是给定开始和结束期间从 1 到编号记录的行数。这意味着如果它包含 1980 年到结束时间的 100 条记录,那么它在该期间有 1 到 100 条记录。
如果说记录 3 已从 2014 年 4 月 1 日到结束时间被删除,那么记录号 3 之后的所有记录都需要将其行号减 1 以确保行号没有间隙。此外,这反过来意味着我们需要在之后拆分所有记录,这样当您在 2014 年 4 月 1 日之前查看表时,您会看到 100 行。但是在您看到 99 行之后的任何时间。这实质上意味着将记录 4-100 的结束时间更新为 2014 年 3 月 31 日,并插入从 2014 年 4 月 1 日到插入时间结束的新记录,这是一个副本,即数据与行号减 1 相同.
现在我想避免进行许多单独的更新和插入。即每个 90+ x 2。我希望有一种聪明的方法可以通过单个 sql 或少于 90 个左右来完成此操作。
我的想法是这样的
Update table set rownumber=rownumber -1 where rownumber > 3 (Deleted rownumber)
当然这个例子不处理时间的分割和插入
我在 oracle 11g 下运行。 我不能更改表结构,我必须保持行号一致并且在一段时间内没有间隙。此外,任何更新或插入都在这张表上。
任何建议提示将不胜感激。
【问题讨论】:
-
我会说螺丝行号更新,只是在显示时给它们编号。
-
行号是不能忽略的,有其他程序访问这个表依赖于行号。这是我无法控制的,很遗憾我无法改变,否则问题不会那么困难。
-
您需要一个插入、更新和删除触发器来重新编号行,这需要每个触发器运行 1 到 2 次更新语句。抱歉帮不上忙,因为我没有编写可以执行递归的触发器的经验。
-
再说一遍,我不能修改这个表。
-
据我了解,您说过您不能更改表的结构,也不能更新其内容。触发器不会改变表的结构,它是 SQL Server 响应特定请求(插入、更新或选择)执行的操作,具体取决于 DBA 的需要。
标签: sql database performance oracle