加入同一个表时 SQL 结果计数发生变化
Posted
技术标签:
【中文标题】加入同一个表时 SQL 结果计数发生变化【英文标题】:SQL result count changes when joining same table 【发布时间】:2014-01-02 21:26:17 【问题描述】:我有一个复杂的查询,我要加入多个表。结果行数为 1,579,633。但是,当我为现有表添加左连接(即左连接同一个表两次)时,结果行数变为 1,583,755。我认为有重复,并试图用各种子句过滤它们,但没有任何运气。这是查询:
select count(*) from t1 left join
(select t2a, t2b from t2 where t2c = 'FOO'
group by t2a, t2b) r on t1.t1a = r.t2b left join
(select t2a, t2b from t2 where t2d = 'BAR'
group by t2a, t2b) r2 on r.t2a = r2.t2a
where t1.ID in (...)
请注意,如果可能的话,我会将t2
连接组合成一个连接,但t2
中匹配'FOO'
和'BAR'
的行是不同的。因此,我从t2
中选择t2a
值的子集,然后使用该子集匹配具有相同t2a
值和t2d = 'BAR'
的其他行。结果的每一行应为以下形式:
t1.t1a | t1.t1b | ... | t2.t2a | t2.t2b
t2a
可能为 null,如果是这样,t2b
也会在结果集中。
t2
的第二个左连接在结果集中引入了不应该存在的额外行。有什么想法吗?
【问题讨论】:
我看到 r 但看不到 r1,如 "r1.t2a = r2.t2a"。 对不起,错字,我已经修正了。 【参考方案1】:我认为您假设存在重复项是正确的 - 对于 t2a 的某些值,t2b 的唯一值超过 1 个。尝试运行以下 SQL:
SELECT Base.t2a, COUNT(*) as t2bcnt
FROM
(
select t2a, t2b from t2 where t2d = 'BAR'
group by t2a, t2b
) AS Base
GROUP BY Base.t2a
HAVING COUNT(*)>1
ORDER BY Base.t2a
(请注意,内线是第二个左连接中的查询)
这将为您提供第二个查询中“爆炸”行的欺骗。
【讨论】:
结果中有 72 行,大多数 t2bcnt = 2。我注意到一个“5”和几个“3”。以上是关于加入同一个表时 SQL 结果计数发生变化的主要内容,如果未能解决你的问题,请参考以下文章
如果 dataSource 计数可能发生变化,是不是可以同时使用 reloadItemsAtIndexPaths 和 reloadData?