2017-03-06 4 views
0

Ich versuche, eine Abfrage in das MS SQL Server-Tool zu schreiben, obwohl ich eher Oracle SQL Developer bin. Die folgende Abfrage wird ausgeführt, gibt jedoch nur Ergebnisse aus der ersten Tabelle zurück. Ich habe auch versucht, einen LEFT JOIN anstelle eines FULL OUTER JOIN zu verwenden, aber ich bekomme die gleichen Ergebnisse. Was mache ich falsch?T-SQL Outer Join mit mehreren Tabellen funktioniert nicht

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

Da Sie nur Spalten von 'c_s' auswählen ... was versuchen Sie von was? – SqlZim

+0

können Sie bitte Beispieldaten und Ausgabe bereitstellen. Danke – maSTAShuFu

+0

Hi @SqlZim zwei der Spalten (LogNo und nl_Form) sollte in jeder Tabelle existieren, aber ich bin nur in der Lage, Ergebnisse aus der Tabelle c_Submission – b00kgrrl

Antwort

1

Zustand in der Where in der ON Klausel sein sollte, da sonst der volle wird sich anschließen in einem Join-seitig:

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 

können Sie coalesce verwenden nicht null LogNo zu erhalten:

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

Wenn ich das versuche, ist es immer noch eine einseitige Abfrage, aber ich bekomme auch Ergebnisse, wo c_s.LogNo Null ist – b00kgrrl

+0

@ b00kgrrl - Wenn Sie eine vollständige wollen Join, dann kann es Zeile geben, in der c_Submission keine übereinstimmende Zeile vom Rest des Joins hatte. Die Nullen, die die ON-Klausel einchecken, schließen jede Zeile aus der c_Submission-Tabelle aus, die LogNo als NULL hat. Also, NULL check-in 'ON' Klausel Filter nur Nullen aus der Tabelle, aber gleiche in der' WHERE' -Klausel filtert Nullen aus Tabelle sowie die Join – GurV

+0

Die c_Submission Tabelle hat Metadaten, wenn also LogNo in den anderen vier Tabellen existiert, dann wird es auch in c_Submission existieren. So sollte ein linker Join eigentlich in Ordnung sein und der Null-Check sollte kein Problem sein. – b00kgrrl

2

Wenn Sie die erste Tabelle vorfiltern möchten, ist es besser, dies in Unterabfrage oder CTE zu tun. Und wenn Sie eine echte vollständige Join aller Tabellen wollen, müssen Sie COALESCE auf den Keys verwenden. Andernfalls wird es zu einem LEFT-Join.

;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

Das gleiche wie oben ... Wenn ich das versuche, ist es immer noch eine einseitige Abfrage, aber ich bekomme auch Ergebnisse, wo c_s.LogNo null ist – b00kgrrl

+0

Es scheint mir, dass Sie Linke Join statt Full Join verwenden müssen. –

+0

Können Sie bitte "einseitige" Abfrage ausführen? Und was versuchst du zu erreichen? –