我在两个表上运行左外连接,但获取的结果不是预期的。我已经给出了以下示例:
当我在个别tavles上运行条件时,以下是计数。
select count(*) from TableA
where ColumnA= 'X'
and ColumnB like 'ABC'
--Count 10000
select count(*) from TableB
where ColumnD in ('hello','there')
--Count 7350
select count(*) from TableA ta
LEFT JOIN TableB tb
on ta.ColumnM = tb.ColumnN
where ta.ColumnA= 'X'
and ta.ColumnB like 'ABC'
and tb.ColumnD in ('hello','there')
Expected Count - 10000
Actual Count - 7300
我假设我对连接的理解在这种情况下是不正确的。谁能解释这种行为,让我知道我哪里出错了?
答案 0 :(得分:4)
外连接表(where
)上的tb.ColumnD in ('hello','there')
条件将外连接转回内连接。
您需要在join子句中应用该条件:
select count(*)
from TableA ta
LEFT JOIN TableB tb
on ta.ColumnM = tb.ColumnN
and tb.ColumnD in ('hello','there')
where ta.ColumnA= 'X'
and ta.ColumnB like 'ABC'
答案 1 :(得分:3)
您期望返回10k行的原因是左连接应该为第一个表中的每个人生成一行。当它没有找到一行时,它会产生一个null,你将使用这个子句删除它:
and tb.ColumnD in ('hello','there')
如果你想要10k行,请在jouin之前应用表b上的where子句,而不是之后:
select count(*) from TableA ta
LEFT JOIN (select * from TableB tb.ColumnD in ('hello','there') ) tb
on ta.ColumnM = tb.ColumnN
where ta.ColumnA= 'X'
and ta.ColumnB like 'ABC'
编辑...这样做效果更好,感谢评论:
select count(*) from TableA ta
LEFT JOIN TableB tb
on ta.ColumnM = tb.ColumnN and tb.ColumnD in ('hello','there')
where ta.ColumnA= 'X'
and ta.ColumnB like 'ABC'