Sql 不存在无效的关系运算符
我有一个类似以下列的表:bad\u mrn、good\u mrn、cr\u dateSql 不存在无效的关系运算符,sql,oracle,Sql,Oracle,我有一个类似以下列的表:bad\u mrn、good\u mrn、cr\u 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'); 所以最后。
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_合并表开始有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:无效的关系运算符
92000000-无效的关系运算符
感谢您提供的帮助。您不能简单地将“不存在”替换为“不存在”
NOT IN针对子查询的结果测试括号中的一列或一组列,子查询必须返回相同数量的列
SELECT a.cols
FROM table_a a
WHERE a.id NOT IN (
SELECT b.id
FROM table_b b
)
或
NOT EXISTS测试子查询是否返回零行TRUE或一行或多行FALSE。通常,子查询与外部查询相关,即子查询中的一列或一组列将根据外部查询中的一列或一组列进行测试
SELECT a.cols
FROM table_a a
WHERE NOT EXISTS (
SELECT 1
FROM table_b b
WHERE b.id = a.id
)
在您的具体示例中,在我看来,您似乎无法合理地重写该子句以使用NOT EXISTS 如果有人看了这个谢谢。。但是,我的DBA能够挤进我来帮我解决这个问题。。答案是使它更简单、更有效 从选择好\u mrn中选择好\u mrn,通过根坏\u mrn连接坏\u,更改日期,坏\u mrn 从mrn\u合并开始,以good\u mrn=?还是坏的? 通过坏的连接\u mrn=先前的好的\u mrn,其中好的\u mrn不在
从mrn\u merge和rownum中选择bad\u mrn您考虑过递归函数吗?如果您运行的是相当不错的Oracle>=10g,您可以研究MODEL子句示例INSERT中列的顺序是什么?坏的,好的还是好的,坏的?在insert语句中不指定列是一个非常坏的习惯。我在java中使用了递归方法,但我想改变这种习惯,让数据库为我完成这项工作。我对pl/sql一窍不通,我需要努力发展这项技能。。
SELECT a.cols
FROM table_a a
WHERE NOT EXISTS (
SELECT 1
FROM table_b b
WHERE b.id = a.id
)