导致 ID 计数不一致的 Oracle Toad SQL 查询
Oracle Toad SQL queries leading to inconsistent id counts
我在编辑器 window 中通过 SQL 命令使用 Oracle Toad。
我创建了两个新表(PIDS1
和 PIDS2
),它们仅包含两个相关表中的一列 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
.
我在编辑器 window 中通过 SQL 命令使用 Oracle Toad。
我创建了两个新表(PIDS1
和 PIDS2
),它们仅包含两个相关表中的一列 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
.