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。
我创建了两个新表(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
【问题讨论】:
【参考方案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 查询一起使用时性能较快