加入同一个表时 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?

apache在发布请求时返回403错误,输入变量计数保持不变,值发生变化

SQL查询加入不同的表和计数

如何推断 SQL Server 中的日期以计算每日计数?

基于列值变化的 T-SQL 递增计数器

SQL加入并在表中获取计数