Oracle Toad SQL 查询导致 id 计数不一致

Posted

技术标签:

【中文标题】Oracle Toad SQL 查询导致 id 计数不一致【英文标题】:Oracle Toad SQL queries leading to inconsistent id counts 【发布时间】:2020-02-18 18:51:49 【问题描述】:

我在编辑器窗口中使用带有 SQL 命令的 Oracle Toad。

我创建了两个新表(PIDS1PIDS2),其中仅包含来自两个相关表的一列 ID 号。

我曾预计PIDS2 将包含PIDS1 中ID 的超集。当我试图识别PIDS2 中不在PIDS1 中的ID 时,我开始了一场野鹅追逐。

假设我的表中的数据发生了一些意想不到的事情。但我无法理解下面描述的两个简化查询。数字不一致。有人可以解释发生了什么吗?

-- PIDS1 IS A SINGLE-COLUMN TABLE THAT CONTAINS 1638061 DISTINCT ID'S
-- PIDS2 IS A SINGLE-COLUMN TABLE THAT CONTAINS 3510272 DISTINCT ID'S

SELECT COUNT(T2.ID)
    FROM PIDS2 T2
    WHERE T2.ID NOT IN (
        SELECT T1.ID
        FROM PIDS1 T1);

-- RESULT IS ZERO!
-- WTF? PIDS2 HAS MORE ID'S THAN PIDS1!

SELECT COUNT(T1.ID)
    FROM PIDS1 T1
    WHERE T1.ID NOT IN (
        SELECT T2.ID
        FROM PIDS2 T2);

-- RESULT IS 786690
-- WHERE DID THAT NUMBER COME FROM? LOOKS ARBITRARY

【问题讨论】:

【参考方案1】:

从不NOT IN 与子查询一起使用。如果子查询返回的任何个值是NULL,则所有行都被过滤掉。

因此,我总是建议NOT EXISTS

SELECT T2.ID
FROM PIDS2 T2
WHERE NOT EXISTS (SELECT 1 FROM PIDS1 T1 WHERE t1.ID = T2.ID);

当然,您也可以在NOT IN 版本中添加WHERE t1.ID IS NOT NULL。根据我的经验,你会在未来某个不合时宜的时候忘记它。只需使用NOT EXISTS

【讨论】:

当我尝试“不存在”时,我得到“ora-00920:无效的关系运算符”但以下代码可以满足我的要求:-- STEP 3 REVISITED SELECT COUNT(T2.ID) FROM PIDS2 T2 WHERE T2.ID IS NOT NULL AND T2.ID NOT IN ( SELECT T1.ID FROM PIDS1 T1 WHERE T1.ID IS NOT NULL); 请注意,我必须为 T2.ID T1.ID 输入“IS NOT NULL” 使用 NOT EXISTS 会是更好的解决方案,但我的 oracle sql 不喜欢它。是否有不同的语法可以在 oracle 中使用? Oracle 支持 NOT EXISTS 几十年了,肯定是有其他原因导致该错误。

以上是关于Oracle Toad SQL 查询导致 id 计数不一致的主要内容,如果未能解决你的问题,请参考以下文章

用于 Oracle 查询开发的 SQL 工具和 Toad IDE 的替代方案

Hibernate + Java 性能较慢,但当我将 TOAD 与相同的本机 Oracle 查询一起使用时性能较快

用文字查询慢,用变量查询快 - Oracle/Toad

oracle数据库管理工具都有哪些?

如何将 SQL 开发人员/Toad 连接到 Oracle 8i

使用toad,查询表有没有被人锁定的sql