Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 左连接未产生预期结果_Sql_Sql Server_Tsql - Fatal编程技术网

Sql 左连接未产生预期结果

Sql 左连接未产生预期结果,sql,sql-server,tsql,Sql,Sql Server,Tsql,在向任何人提出我的问题之前,我做了一些研究,但似乎找不到相关的解决方案 我正在处理数据库中的两个表,一个叫做jobs,另一个叫做jobsClosed。作业表中不在作业关闭中的作业(必须同时考虑作业ID和子作业ID)是打开的作业,否则将关闭。下面是两个表格的示例。现在,在这些例子中,我只包括我关心的数据字段。我正在处理的实际表有更多的字段(我怀疑这就是为什么我没有得到预期结果的原因) 作业 Company JobID SubJobID NoOfSubJobs Co

在向任何人提出我的问题之前,我做了一些研究,但似乎找不到相关的解决方案

我正在处理数据库中的两个表,一个叫做
jobs
,另一个叫做
jobsClosed
作业
表中不在
作业关闭
中的作业(必须同时考虑
作业ID
子作业ID
)是打开的作业,否则将关闭。下面是两个表格的示例。现在,在这些例子中,我只包括我关心的数据字段。我正在处理的实际表有更多的字段(我怀疑这就是为什么我没有得到预期结果的原因)

作业

Company     JobID       SubJobID        NoOfSubJobs
Company1     A                              1
Company1     A              1               0
作业已关闭

Company     JobID       SubJobID        
Company1     A              1               
某些作业在
subboid
下有一个空白条目

我所需要的是仍然空缺的工作。因此,使用此查询:

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

的工作。将
c.Company='Company1'
条件从
WHERE
移动到
ON
以实现
左连接
结果:

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子句中有这样的右侧表条件,则左侧联接将返回常规的内部联接结果。

c.Company='Company1'
条件从
WHERE
移动到
ON
以获得真正的
左侧联接
结果:

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子句中有这样的右侧表条件,则左侧联接将返回常规的内部联接结果。

我建议使用
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'
                 );

我建议使用
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'
                 );
根据你的例子,请求没有返回任何想法; 您的join子句条件的原因!以及如何从中获取空值 作业已关闭,与加入



作业表中不在jobsClosed(必须同时考虑JobID和SubboId)中的作业是打开的作业,否则将关闭。 @Gordon Linoff已经回答了你的问题

根据你的例子,请求没有返回任何想法; 您的join子句条件的原因!以及如何从中获取空值 作业已关闭,与加入



作业表中不在jobsClosed(必须同时考虑JobID和SubboId)中的作业是打开的作业,否则将关闭。 @Gordon Linoff已经回答了你的问题


我尝试了一下,结果给了我不属于
公司1
的工作,尽管我像你演示的那样包括了它。过滤
j.Company
,而不是连接的内部。这样做了!谢谢shawnt00I,我尝试了一下,结果给了我不属于
公司1
的工作,尽管我像你演示的那样包括了它。在
j.Company
上过滤,而不是在连接的内部。成功了!谢谢,我道歉。我最初认为这是可行的,但经过审查,我注意到我在结果中为与
Company1
无关的公司找到了工作。有什么建议吗?在外部查询中过滤
j.Company
。我很抱歉。我最初认为这是可行的,但经过审查,我注意到我在结果中为与
Company1
无关的公司找到了工作。有什么建议吗?在外部查询中筛选
j.Company
。您有一个条件c.Company='Company1',您希望c.Company=null?您有一个条件c.Company='Company1',您希望c.Company=null?