具有多个 EXISTS 的查询返回太多行

Posted

技术标签:

【中文标题】具有多个 EXISTS 的查询返回太多行【英文标题】:Query with multiple EXISTS returing too many rows 【发布时间】:2014-10-20 14:54:16 【问题描述】:

原始表中有 1466303 条记录,我已将其中 1108441 条记录插入到单独的表中。我想知道的是剩下什么数据?所以我使用多个存在进行了查询以查找剩余的数据:

SELECT SG_customer,
       PHONE,
       SG_Name,
       SG_Secondary_Address,
       SG_Primary_Address,
       SG_City,
       SG_State,
       SG_Zip,
       SG_Email
FROM   FMJ_DB_VPI_EXPANDED_DATA X
WHERE  NOT EXISTS (SELECT 1
                   FROM   FMJScore
                   WHERE  SGID = X.SG_Customer
                          AND Phone = X.Phone
                          AND Name = X.SG_Name
                          AND SecondAddress = X.SG_Secondary_Address
                          AND Address = X.SG_Primary_Address
                          AND City = X.SG_City
                          AND State = X.SG_State
                          AND Zip = X.SG_Zip
                          AND Email = X.SG_Email) 

运行这个返回144391条记录,应该有357862的差异,我不明白为什么返回这么多记录。

【问题讨论】:

我的第一个猜测是有些字段是NULL,所以没有找到匹配项。 是的,有些是空的,有没有办法用空数据做到这一点? 从 t1 中选择 * 减去从 t2 中选择 *; (见 MINUS 运算符) 如果你使用 MINUS 考虑到 MINUS 消除了重复,所以结果可能仍然包含更少的行 您使用的是什么关系型数据库?对 SQL Server 使用 EXCEPT(而不是 MINUS 【参考方案1】:

我假设您希望 null 被视为等于 null,我还假设 '' 不用作值,如果它用通常不会出现的东西替换它:

SELECT SG_customer,
   PHONE,
   SG_Name,
   SG_Secondary_Address,
   SG_Primary_Address,
   SG_City,
   SG_State,
   SG_Zip,
   SG_Email
FROM   FMJ_DB_VPI_EXPANDED_DATA X
WHERE  NOT EXISTS (SELECT 1
               FROM   FMJScore
               WHERE  coalesce(SGID,'') = coalesce(X.SG_Customer,'')
                      AND coalesce(Phone,'') = coalesce(X.Phone,'')
                      AND coalesce(Name,'') = coalesce(X.SG_Name,'')
                      AND coalesce(SecondAddress,'') = coalesce(X.SG_Secondary_Address,'')
                      AND coalesce(Address,'') = coalesce(X.SG_Primary_Address,'')
                      AND coalesce(City,'') = coalesce(X.SG_City,'')
                      AND coalesce(State,'') = coalesce(X.SG_State,'')
                      AND coalesce(Zip,'') = coalesce(X.SG_Zip,'')
                      AND coalesce(Email,'') = coalesce(X.SG_Email,''))

由于函数调用,优化器可能无法有效使用索引

【讨论】:

以上是关于具有多个 EXISTS 的查询返回太多行的主要内容,如果未能解决你的问题,请参考以下文章

Oracle - 匿名过程循环遍历多个表(动态) - 查询返回多行

如何使用 SqlCommand 返回多个结果集?

ORA-01427:单行子查询返回多行 - 如何修复?

ORA-01427:单行子查询返回多个行

DB2 查询问题 - 我应该使用 Exists 吗?

MongoDB/PyMongo:查询多个条件 - 意外结果