【问题标题】:Oracle Toad SQL queries leading to inconsistent id countsOracle Toad SQL 查询导致 id 计数不一致
【发布时间】: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

【问题讨论】:

    标签: sql oracle compare subquery toad


    【解决方案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 几十年了,肯定是有其他原因导致该错误。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-20
    • 2020-06-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多