2017-03-06 68 views
0

雖然我更習慣於使用Oracle SQL Developer,但我試圖在MS SQL Server工具中編寫查詢。下面的查詢運行,但它只返回第一個表的結果。我也嘗試使用LEFT JOIN而不是FULL OUTER JOIN,但是我得到了相同的結果。我究竟做錯了什麼?多個表不能正常工作的T-SQL外連接

SELECT c_s.FiscalYear, c_s.LeadMinistry, c_s.LogNo, c_s.MinRef, c_s.nl_Form 
    FROM [cds].[dbo].[c_Submission] c_s 
FULL OUTER JOIN [cds].[dbo].[c_AdminData] c_ad 
ON c_s.LogNo = c_ad.LogNo 
FULL OUTER JOIN [cds].[dbo].[c_Edited Key Comments] c_kc 
ON c_s.LogNo = c_kc.LogNo 
FULL OUTER JOIN [cds].[dbo].[c_Edited Minutes] c_min 
ON c_s.LogNo = c_min.LogNo 
FULL OUTER JOIN [cds].[dbo].[c_MB20BA] c_bn 
ON c_s.LogNo = c_bn.LogNo 
WHERE (c_s.LogNo IS NOT NULL) 
ORDER BY c_s.LogNo; 
+1

既然你只是從'c_s'中選擇列...你想從什麼中得到什麼? – SqlZim

+0

可以請你提供樣品數據和輸出。謝謝 – maSTAShuFu

+0

Hi @SqlZim兩列(LogNo和nl_Form)應該存在於每個表中,但我只能從c_Submission表中得到結果 – b00kgrrl

回答

1

條件在Where應該是ON條款,否則全部加入將變成一個以片面的加入:

select c_s.FiscalYear, 
    c_s.LeadMinistry, 
    c_s.LogNo,  -- Use coalesce to get non null LogNo from the join 
    c_s.MinRef, 
    c_s.nl_Form 
from [cds].[dbo].[c_Submission] c_s 
full outer join [cds].[dbo].[c_AdminData] c_ad 
    on c_s.LogNo = c_ad.LogNo 
full outer join [cds].[dbo].[c_Edited Key Comments] c_kc 
    on c_s.LogNo = c_kc.LogNo 
full outer join [cds].[dbo].[c_Edited Minutes] c_min 
    on c_s.LogNo = c_min.LogNo 
full outer join [cds].[dbo].[c_MB20BA] c_bn 
    on c_s.LogNo = c_bn.LogNo 
     and c_s.LogNo is not null 
order by c_s.LogNo 

您可以使用聚結以獲取非空LogNo:

COALESCE(c_s.LogNo, c_ad.LogNo, c_kc.LogNo, c_min.LogNo) 
+0

當我嘗試時,它仍然是單向查詢,但我也得到結果,其中c_s.LogNo爲空 – b00kgrrl

+0

@ b00kgrrl - 如果您想要滿join,那麼可能有行的c_Submission沒有匹配其餘連接的行。 「ON」子句中的空值檢查將排除c_Submission表中LogNo爲NULL的任何行。因此,NULL檢查'ON'子句只從表中刪除空值,但在WHERE子句中刪除空值以及連接 – GurV

+0

c_Submission表具有元數據,因此如果其他四個表中存在LogNo,那麼它也會存在於c_Submission中。所以左連接實際上應該可以,並且空檢查應該不成問題。 – b00kgrrl

2

如果您想要預過濾第一個表格,最好在子查詢或CTE中進行。如果你想真正完全加入所有的表格,你需要在Keys上使用COALESCE。否則它將成爲一個左連接。

;WITH _Submission AS 
(
    SELECT * FROM [cds].[dbo].[c_Submission] c_s 
    WHERE (c_s.LogNo IS NOT NULL) 
) 

SELECT c_s.FiscalYear, c_s.LeadMinistry, COALESCE(c_s.LogNo, c_ad.LogNo, c_kc.LogNo, c_min.LogNo) AS LogNo, c_s.MinRef, c_s.nl_Form 
FROM _Submission c_s 
    FULL OUTER JOIN [cds].[dbo].[c_AdminData] c_ad 
     ON c_s.LogNo = c_ad.LogNo 
    FULL OUTER JOIN [cds].[dbo].[c_Edited Key Comments] c_kc 
     ON COALESCE(c_s.LogNo, c_ad.LogNo) = c_kc.LogNo 
    FULL OUTER JOIN [cds].[dbo].[c_Edited Minutes] c_min 
     ON COALESCE(c_s.LogNo, c_ad.LogNo, c_kc.LogNo) = c_min.LogNo 
    FULL OUTER JOIN [cds].[dbo].[c_MB20BA] c_bn 
     ON COALESCE(c_s.LogNo, c_ad.LogNo, c_kc.LogNo, c_min.LogNo) = c_bn.LogNo 
ORDER BY LogNo; 
+0

與上面相同...當我嘗試時,它仍是單向查詢,但我也得到結果,其中c_s.LogNo爲null – b00kgrrl

+0

在我看來,您需要使用左連接而不是完全連接。 –

+0

您可以詳細解釋「單向」查詢嗎?你想達到什麼目的? –