2017-01-19 5 views
1

Ich habe ein Problem mit der folgenden Abfrage:Abfrage mit dem linken äußeren Verknüpfung in SQL

select main.courseid 
    ,main.coursename 
    ,main.catid 
    ,main.catname 
    ,main.need_dte 
from (
    select t1.courseid 
     ,t1.coursename 
     ,t2.catid 
     ,t2 
     ,catname 
     ,t2.need_dte 
    from t1 
     ,t2 
    where t1.courseid = t2.courseid 
     and t1.coursename = t2.coursename 
    ) main 
left outer join (
    select courseid 
     ,coursename 
     ,need_dte training_info 
    ) ui on main.courseid = ui.courseid 
    and main.coursename = ui.coursename 
    and main.need_dte = ui.need_dte 

ich das oben beschriebene Szenario habe, in denen ich äußert zwischen den Tabellen beitreten zu tun versuchen links „main“ und „training_info ".

Haupttabelle: eine innere Verbindung zwischen t1 und t2, um das Training und die Kategoriedetails zu erhalten.

training_info (ui): hat Trainingsdetails ohne Kategoriedetails.

Hier habe ich einige Kursdetails in "Main" und "Ui" -Tabellen gemeinsam. und ich habe einige einzigartige Kursaufzeichnungen in "Haupt" -Tabelle nicht in "UI" -Tabelle. also versuche ich, sowohl die einzigartigen als auch die gemeinsamen Aufzeichnungen zu extrahieren.

Ich bin in der Lage, die Ergebnisse für diese Verbindung zu erhalten, aber das Problem ist mit der need_dte. Das Feld need_dte ist in beiden Tabellen vorhanden. Im Ergebnis, wenn die Datensätze aus der Tabelle "main" stammen, kann das Feld need_dte von der inneren Tabelle t2 aktualisiert werden. Wenn die Datensätze aus der Tabelle "ui" im Ergebnis stammen, wird need_dte nicht gefüllt.

Gibt es eine Möglichkeit, diese Join-Einrichtung zu verwenden Ich brauche die need_dte für die Ergebnisdatensätze aus der Tabelle training_info, auch wenn diese Datensätze eine need_dte haben.

Danke!

Antwort

1

Wollen Sie das?

select t1.courseid, t1.coursename, t2.catid, t2.catname, 
     coalesce(ti.need_dte, t2.need_dte) as need_dte 
from t1 join 
    t2 
    on t1.courseid = t2.courseid and 
     t1.coursename = t2.coursename left outer join 
    training_info ti 
    on t1.courseid = ti.courseid and 
     t1.coursename = ti.coursename and 
     t2.need_dte = ti.need_dte; 

Ich finde Ihre Abfrage mit den verschachtelten Unterabfragen, mehrere Ebenen der Namensgebung und archaischer join Syntax schwierig zu sein, zu lesen. Ich denke, dass das oben gesuchte ist. Es gibt need_dte von training_info, wenn vorhanden, und dann von t2 zurück.

+0

Entweder so oder vielleicht braucht das OP einfach zwei Spalten, eine wie 'main_need_dte' und die andere' trainings_need_dte'. (Entweder kann in einigen Zeilen "null" sein - vielleicht ist das in Ordnung.) – mathguy

+0

Danke coalesce funktionierte :) – user3262279

Verwandte Themen