sql - NOT EXISTS 无效关系运算符

标签 sql oracle

我有一个类似于以下列的表格: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/

相关文章:

sql - 查询计算不同值的数量?

sql - 插入语句返回错误

sql - ORACLE PL/SQL 检查字符串是否为NULL

sql - 如何在 do 列中按日期划分分组数据

php - Mysql变量计算

具有多个 INNER JOIN 的 MySQL 查询

perl - 如何使用 Perl 的 DBI 将日期值从 Oracle 转换为 Excel?

oracle - 使用 Javascript 访问 Oracle ATG 变量

.net - ODP.NET集成安全性无效的连接字符串参数

c# - ODP.NET 托管 - 无法找到请求的 .Net Framework 数据提供程序