这种需求可以用SQL语句实现吗?

编译失败 2010-08-31 01:34:12
表A,用来记录某几个字段变更日志,例:

日期 原值 目标值
2010-1-1 XXX YYY
2010-5-1 YYY ZZZ
2010-1-1 AAA BBB

其中第1,2行是经过两次转换的,有什么语句可以得到如下的结果:

原值 目标值
XXX ZZZ
AAA BBB

即说明,现在的ZZZ最早是从XXX转换而来的。
...全文
145 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
minitoy 2010-08-31
  • 打赏
  • 举报
回复
你的数据存在循环
minitoy 2010-08-31
  • 打赏
  • 举报
回复
select connect_by_root(old),new from table a start with not exists(select 1 from
table b where b.new=a.old) where connect_by_isleaf=1
connect by nocycle prior a.new=a.old
编译失败 2010-08-31
  • 打赏
  • 举报
回复
都是牛X,不过改成我的表后有个错误提示:

ORA-01436: CONNECT BY loop in user data

是不是数据有什么问题?我的表里其实还有个字段NUM,例子中只是其中一个NUM的数据。
wzglovejava 2010-08-31
  • 打赏
  • 举报
回复
都厉害,偶竟然看不懂。
gelyon 2010-08-31
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 minitoy 的回复:]
select connect_by_root(old),new from table a start with not exists(select 1 from
table b where b.new=a.old) where connect_by_isleaf=1
connect by prior a.new=a.old
[/Quote]

楼上快哦

WITH a AS(
SELECT '2010-1-1' rq,'XXX' yz,'YYY' mbz FROM dual
UNION ALL
SELECT '2010-5-1' ,'YYY' ,'ZZZ' FROM dual
UNION ALL
SELECT '2010-1-1' ,'AAA' ,'BBB' FROM dual
)
SELECT CONNECT_BY_ROOT(yz),mbz FROM a
WHERE CONNECT_by_isleaf=1
START with NOT EXISTS(select 1 from a b where b.mbz=a.yz)
CONNECT BY PRIOR mbz=yz
minitoy 2010-08-31
  • 打赏
  • 举报
回复
select connect_by_root(old),new from table a start with not exists(select 1 from
table b where b.new=a.old) where connect_by_isleaf=1
connect by prior a.new=a.old
csuxp2008 2010-08-31
  • 打赏
  • 举报
回复
不一定,递归的语法忘了,

好像是
...
start with
conect by..

你自己搜搜看,我想不用过程可以搞定
编译失败 2010-08-31
  • 打赏
  • 举报
回复
那一定要用存储过程喽
csuxp2008 2010-08-31
  • 打赏
  • 举报
回复
可以用递归,查找每个根节点的叶子节点

17,086

社区成员

发帖
与我相关
我的任务
社区描述
Oracle开发相关技术讨论
社区管理员
  • 开发
  • Lucifer三思而后行
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧