左连接没有产生预期的结果

时间:2018-04-08 19:35:36

标签: sql sql-server tsql

我做了一些研究然后纠缠任何人我的问题,我似乎无法找到相关的解决方案。

我正在使用数据库中的两个表,一个名为jobs,另一个名为jobsClosedjobs表中不在jobsClosedJobIDSubJobId中的作业必须同时考虑)的作业是打开的作业,否则将关闭。以下是两个表的示例。现在,在这些例子中,我只包含了我所关心的数据字段。我正在使用的实际表格有更多的字段(我怀疑这就是为什么我没有得到我期望的结果)。

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的作业。

3 个答案:

答案 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 已经回答了你的问题。