Left Join未得到预期结果:如何筛选未关闭的Jobs数据?
解决基于JobID+SubJobId筛选未关闭/已关闭作业的问题
Hey there! I get what you're trying to do here—you need to split your jobs into open (only in the jobs table) and closed (exists in both tables) using a composite match on JobID and SubJobId. Let's break down the best ways to handle this.
方法1:LEFT JOIN + IS NULL(最直观)
这是最常用的写法,思路是关联两张表后,筛选出jobsClosed中没有匹配到的记录(关联后jobsClosed的核心字段为NULL的情况)。
查询未关闭作业(仅存在于jobs表)
SELECT j.* FROM jobs j LEFT JOIN jobsClosed jc ON j.JobID = jc.JobID AND j.SubJobId = jc.SubJobId WHERE jc.JobID IS NULL;
查询已关闭作业(同时存在于两张表)
反过来用INNER JOIN就能直接拿到匹配的记录:
SELECT j.* FROM jobs j INNER JOIN jobsClosed jc ON j.JobID = jc.JobID AND j.SubJobId = jc.SubJobId;
方法2:NOT EXISTS(性能友好)
如果你的表数据量较大,NOT EXISTS通常性能更优——它一旦找到匹配记录就会停止扫描,不需要像LEFT JOIN那样处理全量关联结果。
查询未关闭作业
SELECT * FROM jobs j WHERE NOT EXISTS ( SELECT 1 FROM jobsClosed jc WHERE jc.JobID = j.JobID AND jc.SubJobId = j.SubJobId );
查询已关闭作业
对应的用EXISTS即可:
SELECT * FROM jobs j WHERE EXISTS ( SELECT 1 FROM jobsClosed jc WHERE jc.JobID = j.JobID AND jc.SubJobId = j.SubJobId );
方法3:EXCEPT(适用于支持的数据库)
如果你的数据库支持EXCEPT关键字(比如SQL Server、PostgreSQL),这是一种非常简洁的写法,会返回第一张表有但第二张表没有的记录(注意字段数量和类型要匹配)。
查询未关闭作业
SELECT JobID, SubJobId, [其他你需要的字段] FROM jobs EXCEPT SELECT JobID, SubJobId, [其他你需要的字段] FROM jobsClosed;
注意:EXCEPT会自动去重,如果
jobs表存在重复的JobID+SubJobId记录,这个方法会合并它们。若需保留重复,可使用EXCEPT ALL(部分数据库支持)。
实用小提示
- 记得在两张表的
JobID和SubJobId上建立联合索引,不管用哪种方法,都能大幅提升查询速度。 - 实际查询时尽量明确列出需要的字段,避免用
*——尤其是JOIN场景下,能防止字段名冲突,也更高效。
内容的提问来源于stack exchange,提问作者erik7970
相关产品推荐
相关产品推荐

