连接相同表时SQL结果计数更改

时间:2014-01-02 21:26:18

标签: sql sql-server join

我有一个复杂的查询,我要加入多个表。结果行数为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的第二个左连接是在结果集中引入了不应存在的其他行。有什么想法吗?

1 个答案:

答案 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

(请注意,内线是第二个左连接中的查询)

这将为您提供第二个查询中的“爆炸”行的欺骗。