如何创建一个连接,它总是为Unit中那些在Test中有一行的单元返回一行,即使test中的行在TestDetail中,PartID在Part中有一行,PartFamilyID有一个在PartFamily中使用Name不等于,在本例中为B.换句话说,总是返回具有测试记录但在后续连接为false时具有NULL值的单元的记录。
例如,从我预期的下面的代码(我道歉,我没有发布图像的声誉,我无法想办法发布一个表):
u.ID t.IDt.UnitID td.ID td.TestID td.PartID p.ID p.PartFamilyID pf.ID pf.Name
1 NULL NULL NULL NULL NULL NULL NULL NULL NULL
2 NULL NULL NULL NULL NULL NULL NULL NULL NULL
2 15 2 114 15 1115 1115 11115 11115 E
3 NULL NULL NULL NULL NULL NULL NULL NULL NULL
4 14 4 113 14 1112 1112 11114 11114 D
4 16 4 115 16 1114 1114 11115 11115 E
5 NULL NULL NULL NULL NULL NULL NULL NULL NULL
declare @Results table (UnitID int, Value varchar(10))
insert into @Results (UnitID)
values (1),(2),(3),(4),(5)
declare @Unit table (ID int)
insert into @Unit
values (1),(2),(3),(4),(5),(6),(7)
declare @Test table (ID int, UnitID int)
insert into @Test
values (11,1),(12,1),(13,2),(14,4),(15,2),(16,4)
declare @TestDetail table (ID int, TestID int, PartID int)
insert into @TestDetail
values (111,11,1111),(112,13,1111),(113,14,1112),(114,15,1115),(115,16,1114)
declare @Part table (ID int, PartFamilyID int)
insert into @Part
values (1111,11112),(1112,11114),(1113,11114),(1114,11115),(1115,11115)
declare @PartFamily table (ID int, Name varchar(10))
insert into @PartFamily
values (11111,'A'),(11112,'B'),(11113,'C'),(11114,'D'),(11115,'E')
select *
from @Unit u
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'
但是,查询排除了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
返回行时实际可行。 如果返回了NULL t.ID行,我预计当单个单元的至少一行包含非NULL t.ID值时,case语句将计算为Yes。
据我所知,我可以随后更新@Results,其中Value为NULL,这很好。
但是,我仍在尝试了解如何获取要返回的所有单元的行。 我认为即使后续(内部)连接没有返回匹配,左连接仍然会离开单元。
如果一个单位在Test中有匹配但测试记录在TestDetail中没有匹配,我如何获得该单元的记录(后续表中没有匹配的列中的NULL值)?
提前致谢!
答案 0 :(得分:0)
你必须在左连接之后进行左连接,因为你更新的方式会禁用t
的左连接,因为t.ID=null
找不到TestDetail td
< / p>
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而不是别的