2016-07-21 9 views
0

Ich bin in einer Situation stecken, wo ich bedingte Join durchführen muss. Die kurze Zusammenfassung könnte sein, ich habe 2 Tabellen TableA und TableB.Abbrechen Join-Bedingung basierend auf Spalte Wert

TableA hat Spalten A1, A2, A3, A4, A5, Condition1, Condition2

ähnlich TableB Spalten B1, B2, Condition1, Condition2

Und ich brauche auf TableA.Condition1 = TableB.Condition1 und Join-Bedingung zu erfüllen beitreten unter TableA.Condition2 = TableB.Condition2 sollte die Bedingung TableA.Condition2 für einen ersten Datensatzeintrag nicht null sein.

Mit anderen Worten, wenn ich irgendwelche Datensätze mit TableA.Condition1 = TableB.Condition1 übereinstimmte und gleichzeitig TableA.Condition2 für keine von ihnen Null ist, dann führen Sie zweite Join, sonst führen Sie keine zweite Join.

Abfrage könnte wie

SELECT A.* FROM TableA A 
INNER JOIN TableB B 
ON A.Condition1 = B.Condition1 -- This must be perform 
AND WHEN A.Condition2 IS NULL THEN 
1 = 1 -- Assuming no join here 
ELSE 
A.Condition2 = B.Condition2 -- perform join 
END 
+0

Ihre Verschleierung der a Genaue Details machen es wahrscheinlich schwieriger für echte Lösungen. Wenn Sie nicht vertrauliche/private Informationen zur Verfügung stellen können und die tatsächliche Kontext Tabelle/Spalten würde definitiv helfen. – DRapp

Antwort

0

Sie werden nur von TableA Auswahl, so wie etwa exists statt mit?

SELECT A.* 
FROM TableA A 
WHERE (A.Condition2 IS NULL AND 
     EXISTS (SELECT 1 FROM TableB b WHERE A.Condition1 = B.Condition1) 
    ) AND 
     (A.Condition2 IS NOT NULL AND 
     EXISTS (SELECT 1 FROM TableB b WHERE A.Condition1 = B.Condition1 AND A.Condition2 = B.Condition2) 
    ); 

Oder, wenn Sie ein JOIN wollen:

SELECT A.* 
FROM TableA A JOIN 
    TableB B 
    ON A.Condition1 = B.Condition1 AND 
     (A.Condition2 IS NOT NULL OR A.Condition2 = B.Condition2); 
+0

Wenn wir über Join-Lösung sprechen, habe ich in Frage gestellt, dass, wenn ein Wert für Condition2 von TableA nicht null ist, dieser Join ausgeführt werden muss. Ihre Frage wird immer dann ausgewählt, wenn sie gleich null ist, obwohl nur wenige Datensätze diesen Wert als nicht null haben. – Imad

0

die Sie interessieren können Sie

SELECT A.* 
FROM TableA A 
INNER JOIN TableB B ON A.Condition1 = B.Condition1 AND 
         ((A.Condition2 IS NOT NULL AND A.Condition2 = B.Condition2) 
         OR (A.Condition2 IS NULL)) 
+0

Ich habe in Frage erwähnt, dass, wenn ein Wert für Condition2 von TableA nicht null ist, dann muss dieser Join durchgeführt werden. Ihre Frage wird immer dann ausgewählt, wenn sie gleich null ist, obwohl nur wenige Datensätze diesen Wert als nicht null haben. – Imad

+0

@Imad Ich habe Ans aktualisiert, Probier es lass es mich wissen, wenn es für dich hilfreich ist –

+0

Immer noch die gleiche Ausgabe :( – Imad

0

schwer zu verstehen, Ihre Frage und noch schwerer helfen, den Zweck

SELECT A.* 
-- join table1 and table2 on Condition1 
FROM TableA A 
JOIN TableB B ON A.Condition1 = B.Condition1 
-- if max condition2 is null then there is nothing but nulls 
JOIN (SELECT MAX(Condition2) Condition2 FROM TableA A2) A2 
-- in that case every row resulting from join1 goes 
ON A2.Condition2 IS NULL 
-- otherwise use condition2 but replace nulls with some placeholder 
-- or maybe you have either all null or no nulls 
OR COALESCE (A.Condition2,'null') = COALESCE (B.Condition2,'null') 
; 
zu verstehen