我有一个类似于以下列的表格: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 - “无效的关系运算符”..
感谢您提供的任何帮助。
最佳答案
您不能简单地将 NOT IN
替换为 NOT EXISTS
。
NOT IN
根据子查询的结果测试一列(或括号内的一组列),子查询必须返回相同数量的列。
SELECT a.cols
FROM table_a a
WHERE a.id NOT IN (
SELECT b.id
FROM table_b b
)
或
SELECT a.cols
FROM table_a a
WHERE (a.id, a.name) NOT IN (
SELECT b.id, b.name
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
。
关于sql - NOT EXISTS 无效关系运算符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13585981/