导致 ID 计数不一致的 Oracle Toad SQL 查询

Oracle Toad SQL queries leading to inconsistent id counts

我在编辑器 window 中通过 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

从不 对子查询使用 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.