我在制作桌子方面有点麻烦,让我解释一下:
带输入的表结构:
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
考虑使用先前的分层函数并以...开头但是从哪里开始?
提前致谢。
答案 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;