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?