2015-04-03 36 views
0

如何創建一個連接,以便始終爲那些在Test中具有行的Unit中的那些單元返回一行,即使Test中的行在TestDetail中帶有PartID在Part中有一行,PartFamilyID在PartFamily中有一行,其名稱不等於(在本例中爲B)。換句話說,總是爲具有測試記錄的單元返回記錄,但在後續連接是錯誤的。SQL連接始終爲後續不匹配返回初始匹配和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,其中值爲NULL這很好。

但是,我仍然試圖瞭解如何獲取所有單位的行被返回。 我認爲左連接仍然會離開單元,即使後續(內部)連接返回不匹配。

如果一個單元在Test中有一個匹配但測試記錄在TestDetail中沒有匹配我怎麼能得到該單元的記錄(在沒有匹配的後續表的列中有NULL值)返回?

在此先感謝!

回答

0

你要做的左聯接後的左連接BEC你做你的更新禁止左連接的t因爲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並沒有別的