具有多个 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 的查询返回太多行的主要内容,如果未能解决你的问题,请参考以下文章