我做了一些研究然后纠缠任何人我的问题,我似乎无法找到相关的解决方案。
我正在使用数据库中的两个表,一个名为jobs
,另一个名为jobsClosed
。 jobs
表中不在jobsClosed
(JobID
和SubJobId
中的作业必须同时考虑)的作业是打开的作业,否则将关闭。以下是两个表的示例。现在,在这些例子中,我只包含了我所关心的数据字段。我正在使用的实际表格有更多的字段(我怀疑这就是为什么我没有得到我期望的结果)。
jobs
Company JobID SubJobID NoOfSubJobs
Company1 A 1
Company1 A 1 0
jobsClosed
Company JobID SubJobID
Company1 A 1
某些职位在SubJobID
下有一个空白条目。
我所需要的只是仍然开放的工作。所以,使用这个查询:
select *
from jobs as j
left join jobsClosed as c
on j.Company = c.Company
and j.JobID = c.JobID
and c.SubJobID = j.SubJobID
where c.Company = 'Company1' --the database has multiple companies and I'm only concerned with this one
and c.JobID is null
我期望进入我正在使用的实际表中:
Company JobID SubJobID NoOfSubJobs Company JobID SubJobID
Company1 A 1 NULL NULL NULL
但我反而得到了:
Company JobID SubJobID NoOfSubJobs Company JobID SubJobID
Company1 A 1 0 Company1 A 1
花了一些时间试图找出原因后,我仍然不太确定。就像我之前提到的那样,我基于我的示例的表包含更多字段,但我仍然以上面详述的相同方式加入它们。难道其他领域会以某种方式扭曲结果吗?
更新:所以我尝试使用Gordon Linoff和Jarlh的建议,但似乎生成的查询正在拾取不属于Company1
的作业。
答案 0 :(得分:2)
将c.Company = 'Company1'
条件从WHERE
移至ON
以获得真实的LEFT JOIN
结果:
select *
from jobs as j
left join jobsClosed as c on j.Company = c.Company and j.JobID = c.JobID and
c.SubJobID = j.SubJobID
AND c.Company = 'Company1' --the database has multiple companies and I'm only concerned with this one
WHERE c.JobID is null
如果WHERE子句中有右侧表条件,那么LEFT JOIN会返回常规的INNER JOIN结果。
答案 1 :(得分:2)
我建议使用not exists
,因为这似乎是你真正想要的:
select j.*
from jobs j
where not exists (select 1
from jobsClosed c
where j.Company = c.Company and j.JobID = c.JobID and
c.SubJobID = j.SubJobID and c.Company = 'Company1'
);
答案 2 :(得分:1)
根据您的例子,请求不会返回任何想法; 加入条款标准的原因!以及如何从中获取NULL值 Jobs关闭左加入????
-- if opened jobs are identified by null values on Jobs.SubJobID:
SELECT j.* FROM
Jobs AS j
LEFT JOIN JobsClosed AS c
ON j.company = c.company and
j.JobID = c.JobID
WHERE (j.Company = 'Company1') AND
-- if opened jobs are identified by null values on Jobs.SubJobID:
(j.SubJobID is NULL)
-- if opened jobs are identified by Jobs.NoOfSubJobs > 0:
-- (j.NoOfSubJobs > 0)
作业表中不在jobsClosed中的作业(必须同时考虑JobID和SubJobId)是打开的作业,否则关闭。 @Gordon Linoff 已经回答了你的问题。