Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/71.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 join始终返回初始匹配,并为后续不匹配返回NULL_Sql_Sql Server_Tsql_Join_Sql Update - Fatal编程技术网

SQL join始终返回初始匹配,并为后续不匹配返回NULL

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

如何创建一个连接,该连接将始终为单元中具有测试中的行的那些单元返回一行,即使测试中的行在TestDetail中,PartID中具有PartFamilyID,PartFamilyID中具有名称不等于B的行。换句话说,始终为那些具有测试记录但在后续联接为false时具有空值的单元返回记录

例如,根据下面的代码,我预期(很抱歉,我没有发布图像的声誉,我无法找到发布表格的方法):


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'