Auswählen nicht übereinstimmender Datensätze aus dem vollständigen äußeren Join

507
user

Ich habe zwei Tische

tb1  ------- 1,ali 2,ana 3,kim 6,git 8,sen 9,pam  tb2 ------- 2,joy 3,fin 4,roy 5,dina 9,tim  output ------- 1,ali 2,joy 3,fin 4,roy 5,dina 6,git 8,sen 9,tim 

Ich muss zwei Tabellen verbinden und für allgemeine Spalten sollte ich die ID und den Namen von TB2 berücksichtigen, ansonsten ist es von TB1. Dazu brauche ich nicht passende Datensätze aus beiden Tabellen meiner Abfrage:

select case when tb1.id=tb2.id then tb2.id else tb1.id end as id, case when tb1.id=tb2.id then tb2.name else tb1.name end as name  from tb1 full outer join tb2 on tb1.id=tb2.id; 

es gibt mir nicht die unpassenden Aufzeichnungen. Wie kann ich dies erreichen, ohne mehrere Überprüfungen für Null hinzuzufügen?

1
Ich gehe davon aus, dass Sie SQL Server verwenden, seit Sie `FULL OUTER JOIN` verwenden, richtig? Anstatt "JOIN" zu verwenden, haben Sie mit "UNION" gespielt, um beide Ergebnisse zu vereinigen und dann vielleicht statt dessen eine Unterabfrage auszuwählen. Nur eine kurze Idee ohne zu testen, aber ich stelle meine SQL-Frage auf https://stackoverflow.com und nicht hier. Wenn Sie eine Chance haben, können Sie auch einige Daten auf http://sqlfiddle.com ablegen und einen Link zu Ihrer Frage posten. Pimp Juice IT vor 6 Jahren 1

1 Antwort auf die Frage

0
Mureinik

Die Verwendung von full outer joinsieht korrekt aus, aber die ausgewählten Begriffe behandeln fehlende Elemente nicht korrekt. Verwenden coalescesollte den Trick tun:

SELECT COALESCE (tb2.id, tb1.id) AS id, COALESCE (tb2.name, tb1.name) AS name FROM tb1 FULL OUTER JOIN tb2 ON tb1.id = tb2.id; 
ja, was passiert, wenn ids übereinstimmen, aber tb2.name null ist und tb1.name einen Wert hat? wird es noch tb1.name berücksichtigen? user vor 6 Jahren 0
@user yup, dafür gibt es den `coalesce`-Aufruf. Mureinik vor 6 Jahren 0
hmm aber ich möchte Datensätze von TB2 für alle Spalten abholen, wenn die ID zwischen zwei übereinstimmt, also habe ich row_number verwendet, das funktioniert hat user vor 6 Jahren 0