SQL join始终返回初始匹配,并为后续不匹配返回NULL
如何创建一个连接,该连接将始终为单元中具有测试中的行的那些单元返回一行,即使测试中的行在TestDetail中,PartID中具有PartFamilyID,PartFamilyID中具有名称不等于B的行。换句话说,始终为那些具有测试记录但在后续联接为false时具有空值的单元返回记录 例如,根据下面的代码,我预期(很抱歉,我没有发布图像的声誉,我无法找到发布表格的方法):SQL join始终返回初始匹配,并为后续不匹配返回NULL,sql,sql-server,tsql,join,sql-update,Sql,Sql Server,Tsql,Join,Sql Update,如何创建一个连接,该连接将始终为单元中具有测试中的行的那些单元返回一行,即使测试中的行在TestDetail中,PartID中具有PartFamilyID,PartFamilyID中具有名称不等于B的行。换句话说,始终为那些具有测试记录但在后续联接为false时具有空值的单元返回记录 例如,根据下面的代码,我预期(很抱歉,我没有发布图像的声誉,我无法找到发布表格的方法): declare@Results表(UnitID int,Value varchar(10)) 插入@Results(Uni
declare@Results表(UnitID int,Value varchar(10))
插入@Results(UnitID)
值(1)、(2)、(3)、(4)、(5)
声明@Unit表(ID int)
插入@Unit
值(1)、(2)、(3)、(4)、(5)、(6)、(7)
声明@Test表(ID int,UnitID int)
插入@Test
值(11,1)、(12,1)、(13,2)、(14,4)、(15,2)、(16,4)
声明@TestDetail表(ID int、TestID int、PartID int)
插入到@TestDetail中
数值(111,111111)、(112,131111)、(113,141112)、(114,151115)、(115,161114)
声明@Part表(ID int,PartFamilyID int)
插入@Part
值(111111112)、(111211114)、(111311114)、(111311114)、(111411115)、(111511115)
声明@PartFamily表(ID int,Name varchar(10))
插入到@PartFamily中
值(11111,'A'),(11112,'B'),(11113,'C'),(11114,'D'),(11115,'E'))
挑选*
来自@u单元
左连接@Test t
关于t.UnitID=u.ID
加入@TestDetail td
关于td.TestID=t.ID
加入@Part p
在p.ID=td.PartID上
加入@PartFamily pf
关于pf.ID=p.PartFamilyID
和pf。命名为“B”
但是,查询排除了t.ID为NULL的行,因此只剩下单元2和4的非NULL t.ID行
我尝试了各种不同类型联接的组合,但没有成功
最后,我想使用查询来更新表:
update r
set r.Value = case when t.ID is not NULL then 'Yes' else 'No' end
from @Results r
left join @Unit u
on u.ID = r.UnitID
left join @Test t
on t.UnitID = u.ID
join @TestDetail td
on td.TestID = t.ID
join @Part p
on p.ID = td.PartID
join @PartFamily pf
on pf.ID = p.PartFamilyID
and pf.Name <> 'B'
select * from @Results
updater
设置r.值=当t.ID不为空时,则为“是”,否则为“否”
来自@Results r
左连接@u单元
关于u.ID=r.UnitID
左连接@Test t
关于t.UnitID=u.ID
加入@TestDetail td
关于td.TestID=t.ID
加入@Part p
在p.ID=td.PartID上
加入@PartFamily pf
关于pf.ID=p.PartFamilyID
和pf。命名为“B”
从@Results中选择*
这在返回行时实际起作用。
如果返回空的t.ID行,那么当单个单元的至少一行包含非空的t.ID值时,我希望case语句的计算结果为Yes
我知道我可以随后更新@Results,其中Value为NULL,这很好
但是,我仍在试图理解如何获取要返回的所有单元的行。
我认为,即使后续(内部)连接没有返回匹配项,左连接仍然会离开单元
如果一个单元在测试中有匹配项,但测试记录在TestDetail中没有匹配项,那么我如何才能得到返回的单元记录(后续表的列中有空值,没有匹配项)
提前谢谢 您必须在左连接bec之后执行左连接,因为
t.ID=null
永远找不到TestDetail td
select r.*
, r.ValueNew = case when t.ID is not NULL then 'Yes' else 'No' end
from @Results r
left join @Unit u on u.ID = r.UnitID
left join @Test t on t.UnitID = u.ID
left join @TestDetail td on td.TestID = t.ID
left join @Part p on p.ID = td.PartID
left join @PartFamily pf on pf.ID = p.PartFamilyID and pf.Name <> 'B'
选择r*
,r.ValueNew=如果t.ID不为NULL,则为“是”,否则为“否”
来自@Results r
u.ID=r.UnitID上的单元u左连接
t.UnitID=u.ID上测试t时的左连接
在td.TestID=t.ID上左连接@TestDetail td
p.ID=td.PartID上零件p处的左连接
在pf.ID=p.PartFamilyID和pf.Name“B”上左键连接@PartFamily pf
这样,您将拥有您的记录r,而没有其他内容
update r
set r.Value = case when t.ID is not NULL then 'Yes' else 'No' end
from @Results r
left join @Unit u
on u.ID = r.UnitID
left join @Test t
on t.UnitID = u.ID
join @TestDetail td
on td.TestID = t.ID
join @Part p
on p.ID = td.PartID
join @PartFamily pf
on pf.ID = p.PartFamilyID
and pf.Name <> 'B'
select * from @Results
select r.*
, r.ValueNew = case when t.ID is not NULL then 'Yes' else 'No' end
from @Results r
left join @Unit u on u.ID = r.UnitID
left join @Test t on t.UnitID = u.ID
left join @TestDetail td on td.TestID = t.ID
left join @Part p on p.ID = td.PartID
left join @PartFamily pf on pf.ID = p.PartFamilyID and pf.Name <> 'B'