我有这样的查询
SELECT f.ACCOUNT_ID,
f.TGL,
p.ACCOUNT_EMAILADDRESS
FROM distributor_kokola.forecast f
inner join distributor_kokola.push_distributor p on p.ACCOUNT_ID = f.ACCOUNT_ID
where f.ACCOUNT_ID NOT IN(
select ACCOUNT_ID
from distributor_kokola.forecast
where DATE_FORMAT(TGL, "%Y-%m") = DATE_FORMAT(CURDATE(), "%Y-%m")
group by ACCOUNT_ID
)
group by f.ACCOUNT_ID;
该子查询可以工作,但速度很慢,所以我用 Left Join 更改它,它工作得更快
SELECT f.ACCOUNT_ID,
f.TGL,
p.ACCOUNT_EMAILADDRESS
FROM distributor_kokola.forecast f
left join(
select ACCOUNT_ID
from distributor_kokola.forecast
where DATE_FORMAT(TGL, "%Y-%m") = DATE_FORMAT(CURDATE(), "%Y-%m")
group by ACCOUNT_ID
)subb on subb.ACCOUNT_ID = f.ACCOUNT_ID
inner join distributor_kokola.push_distributor p on p.ACCOUNT_ID = f.ACCOUNT_ID
group by f.ACCOUNT_ID;
但是,我的问题是仍然包含错误的结果,
对于 Not IN,查询 1 选择 NOT IN 查询 2 的位置。
我怎样才能得到像 NOT IN 带有左连接的查询。
有人可以帮助我吗?
谢谢。
最佳答案
您必须添加一个 WHERE 子句来按 LEFT JOIN
的结果进行过滤。如果您添加适当的 WHERE 子句 WHERE subb.ACCOUNT_ID IS NULL
,它应该按预期工作(因为您在子查询中使用了 GROUP BY
,所以不存在重复行的危险):
SELECT f.ACCOUNT_ID,
f.TGL,
p.ACCOUNT_EMAILADDRESS
FROM distributor_kokola.forecast f
left join(
select ACCOUNT_ID
from distributor_kokola.forecast
where DATE_FORMAT(TGL, "%Y-%m") = DATE_FORMAT(CURDATE(), "%Y-%m")
group by ACCOUNT_ID
) subb on subb.ACCOUNT_ID = f.ACCOUNT_ID
inner join distributor_kokola.push_distributor p on p.ACCOUNT_ID = f.ACCOUNT_ID
WHERE sub.ACCOUNT_ID IS NULL
group by f.ACCOUNT_ID;
更新
LEFT JOIN
的目标是查找 forecast
表中在子查询中没有匹配行的所有行。因此,我们需要一个 WHERE
子句来删除具有匹配行的所有行 - WHERE sub.ACCOUNT_ID IS NULL
非常适合。
SO 用户 @quassnoi 写了 wonderful comparison of different methods来实现这个目标。
关于mysql - 子查询不适合左连接替代方案?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46724972/