【发布时间】:2012-11-15 04:15:11
【问题描述】:
我有一个类似于以下列的表:bad_mrn、good_mrn、cr_date
insert into mrn_merge values ( '00000001','00000002', '20121120');
insert into mrn_merge values ( '00000002','00000003', '20121120');
insert into mrn_merge values ( '00000003','00000004', '20121120');
所以最后。
- 1 合并到 2
- 2 合并到 3
- 3 个合并到 4 个
如果我提供 1、2、3 或 4 的输入参数,我需要一个返回 4 的查询。 以下准备好的语句确实有效,但是当我的 mrn_merge 表开始有 40k 条记录时需要很长时间。
SELECT *
FROM
(SELECT good_mrn, LEVEL
FROM mrn_merge
WHERE
(CONNECT_BY_ROOT bad_mrn =
(SELECT bad_mrn FROM mrn_merge WHERE LEVEL =
(SELECT MAX (LEVEL) FROM mrn_merge START WITH good_mrn = ?
CONNECT BY PRIOR bad_mrn = good_mrn )
START WITH good_mrn = ?
CONNECT BY PRIOR bad_mrn = good_mrn)
) OR ( CONNECT_BY_ROOT bad_mrn = ?)
START WITH bad_mrn NOT IN ( SELECT good_mrn FROM mrn_merge )
CONNECT BY bad_mrn = PRIOR good_mrn ORDER BY LEVEL DESC)
WHERE ROWNUM = 1 ;
sql 调优顾问说要使用“NOT EXISTS”代替“NOT IN”,但我得到 ORA-00920:无效的关系运算符 00920. 00000 - “无效的关系运算符”..
感谢您提供的任何帮助。
【问题讨论】:
-
如果您在相当不错的 Oracle (>= 10g) 上运行,您可以研究
MODEL子句 docs.oracle.com/cd/E11882_01/server.112/e25554/… -
示例 INSERT 中列的顺序是什么? bad_mrn、good_mrn 还是 good_mrn、bad_mrn? (在插入语句中不指定列是一个非常不好的习惯)
-
我在 java 中做了一个递归方法,但我想改变它让数据库为我完成工作。我对 pl/sql 一无所知,我需要努力发展这项技能..