SQL分层表需要简化

时间:2016-01-28 12:59:53

标签: sql oracle plsql hierarchy

我在制作桌子方面有点麻烦,让我解释一下:

带输入的表结构:

OLD_KEY | NEW KEY
  4536     4566
  4566     4977
  4321     10290
  5423     8920

我从一个来源获取数据,即在几张表中改变我的PK(序列号);之后,我需要将所有这些表更新为新的序列号。

我的问题是,不是简单的更新,而是数据可以像示例一样,并且对于相同的旧密钥更改两次或更多次(例如)4536首先更改为4566,然后再次更改为4977。

目前这迫使我使用游标,它会逐行更新每个表,并按第一个键和ETC排序......

过去一切都很好,但最近,数据量大大增加了自身,使得这个过程非常繁重并占用了大量资源。

我的问题是:我需要消除所有必须更新两次或更多次的密钥,只需一次,这意味着 - 在上面的示例中输出如下:

OLD_KEY | NEW_KEY
  4536     4977
  4321     10290
  5423     8920

考虑使用先前的分层函数并以...开头但是从哪里开始?

提前致谢。

1 个答案:

答案 0 :(得分:1)

SELECT CONNECT_BY_ROOT( old_key ) AS old_key,
       new_key
FROM   table_name
WHERE  CONNECT_BY_ISLEAF = 1
START WITH old_key NOT IN ( SELECT new_key FROM table_name )
CONNECT BY PRIOR new_key = old_key;