使用左连接添加位置条件



这里非常基本的问题。 但是我被困在 where 条件上,知道我有多个左连接并创建一个子表 w。

这是 mysql

with w as (SELECT t1.c1, count(DISTINCT(t3.c3)) w from t1
left join t2 on t1.c1 = t2.c2
left join t3 on t3.c3 = t2.c3
left join t4 on t4.c4 and t3.c4
where t1.c4 is true
AND t4.c5 NOT ILIKE '%XXX%'
AND t4.c5 > 0

group by 1)
SELECT
w,
count(id)
from w
group by 1
order by 1 ASC

你能帮我了解在哪里正确放置 3 个条件以及它会如何根据我放置它们的位置改变结果吗?

干杯

杰夫

当您有类似查询时

...
FROM a LEFT JOIN b ON a.id = b.id

你从a得到每一行,不管b中是否有对应的行。当b中没有对应的行时,该值为NULL。因此,当您有这样的查询时

...
FROM a LEFT JOIN b ON a.id = b.id
WHERE b.foo = 'bar'

你含蓄地说WHERE b.foo IS NOT NULL,这会把你的LEFT JOIN变成一个INNER JOIN,基本上也过滤表a

有两种方法可以解决此问题。当然,不太漂亮的方式是

WHERE (b.foo = 'bar' OR b.foo IS NULL)

更优雅的方法是将条件也放在连接中。

FROM a LEFT JOIN b ON a.id = b.id AND b.foo = 'bar'

这样,您仍然可以从a获取每一行,但只会从所有条件适用的b中获取行。

现在清楚了吗?

最新更新