我有一个复杂的查询,我要加入多个表。结果行数为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'
的{{1}}中的行不同。因此,我从'BAR'
中选择t2a
值的子集,然后使用此子集匹配具有相同t2
值和t2a
的其他行。每个结果行应采用以下形式:
t2d = 'BAR'
t1.t1a | t1.t1b | ... | t2.t2a | t2.t2b
可能为空,如果是,t2a
也可能在结果集中。
t2b
的第二个左连接是在结果集中引入了不应存在的其他行。有什么想法吗?
答案 0 :(得分: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
(请注意,内线是第二个左连接中的查询)
这将为您提供第二个查询中的“爆炸”行的欺骗。