Willkommen bei Entwickler-Forum.
Seite 3 von 3 ErsteErste 1 2 3
Ergebnis 21 bis 30 von 30
  1. #21
    Stammgast
    Registriert seit
    24.10.2011
    Beiträge
    1.264

    Standard

    Hast Du nur keine Lösung gefunden oder ist Dir auch die Ursache nicht klar?

    Wenn Du Dir anschaust, was womit gejoint wird, dürfte sich dieses Bild ergeben:
    Ein full outer join produziert per Definition aus 2 Mengen eine Vereinigungmenge, in Deinem fall anhand eines Feldes als Joinkriterium.
    Ein full outer join für 3 Mengen gibt es aber nicht, also wird in meinem Beispiel "gestückelt" und zwar unvollständig.

    In meinem Beispiel werden nicht alle Kombinationen der Tabellen gejoined.
    Nur v mit n und n mit g, n ist dadurch ein Bindeglied, das Gleichheit zwischen v und g nicht abdeckt, wenn sie in n fehlt.
    Du brauchst mehr etwas sternförmiges statt eine "Verkettung"

    Du musst also alles noch mal umrühren, gibt sicher verschiedene Wege, das zu lösen. Z.B. die full outer join nicht auf einer Ebene anzulegen, sondern Teilmengen zu bilden.
    Erst nur ein Full Outer Join n:v und das Ergebnis noch mal Full Outer zu g, also (n:v):g. Mein Beispiel wäre eher v:n:g.

    Cool wäre jetzt, wenn ich in Mathe Mengenlehre richtig aufgepasst hätte, dann könnte ich das nett hinschreiben.

    Aber versuch mal, wird schon klappen.
    Gruß, defo

  2. #22
    Stammgast
    Registriert seit
    09.05.2012
    Beiträge
    135

    Standard

    Hallo defo,

    ich habe keine Lösung gefunden!
    Zuerst war ich der Meinung, dass alles richtig läuft, bis ich auf dieses Beispiel gestoßen bin. Grundsätzlich ist mir schon das "full outer Join" suspekt. Genau darüber stolpere ich, weil es 3 Mengen sind.
    Ich habe auf schon das Ganze über eine virtuelle Tabelle mit den gesamten Daten probiert, aber auch da komme ich nicht auf einen grünen Zweig. Leider sind meine Kenntnisse in Oracle total veraltet und daher sehr unzureichend. Google hilft in solch spezifischen Fällen auch nicht weiter. Ich habe auch ein Beispiel in verschiedenen Varianten über ein Union zu lösen versucht, aber da kommt auch nicht das Richtige raus. Sprich 3 Select in denen ich die Tabellen untereinander austausche. Ich glaube, mit jedem Versuch "verschlimmbessere" ich die Sache.
    Wenn ich über Oracle die Lösung nicht finde, programmiere ich das aus.

    vg

  3. #23
    Stammgast
    Registriert seit
    24.10.2011
    Beiträge
    1.264

    Standard

    Zitat Zitat von Urwi Beitrag anzeigen
    Leider sind meine Kenntnisse in Oracle total veraltet und daher sehr unzureichend. Google hilft in solch spezifischen Fällen auch nicht weiter. Ich habe auch ein Beispiel in verschiedenen Varianten über ein Union zu lösen versucht, aber da kommt auch nicht das Richtige raus. Sprich 3 Select in denen ich die Tabellen untereinander austausche.

    Wenn ich über Oracle die Lösung nicht finde, programmiere ich das aus.
    Ach komm, Du musst das Beispiel nur umbauen. Nichts neues nur klammern / anders schachteln. Behaupte ich jetzt mal.
    Und das mit dem "alter" hatten wir doch schon.

    Und Ausprogrammieren klingt ja schon fast wie eine Drohung...

    Ich schau vielleicht heute Abend rein, hab keine Muße grad.
    Gruß, defo

  4. #24
    Stammgast
    Registriert seit
    09.05.2012
    Beiträge
    135

    Standard

    Eine Lösung habe ich, aber ob das in jeder Konstellation funktioniert muss ich erst austesten:

    Code:
    
    select nachname, vorname, gebdat, nvl(n.bearbeitetam, nvl(v.bearbeitetam, g.bearbeitetam)) AnyOfGivenDate
       from            tab_vn v
       LEFT outer join tab_nn n  on n.bearbeitetam = v.bearbeitetam
       LEFT outer join tab_gd g  on g.bearbeitetam = v.bearbeitetam
    	
    UNION
    
     select nachname, vorname, gebdat, nvl(n.bearbeitetam, nvl(v.bearbeitetam, g.bearbeitetam)) AnyOfGivenDate
       from            tab_nn n
       LEFT outer join tab_vn v  on v.bearbeitetam = n.bearbeitetam
       LEFT outer join tab_gd g  on g.bearbeitetam = n.bearbeitetam	
    	
    UNION
    
     select nachname, vorname, gebdat, nvl(n.bearbeitetam, nvl(v.bearbeitetam, g.bearbeitetam)) AnyOfGivenDate
       from            tab_gd g
       LEFT outer join tab_vn v  on v.bearbeitetam = g.bearbeitetam
       LEFT outer join tab_nn n  on n.bearbeitetam = g.bearbeitetam	
    	
    ORDER BY 4	
    
     

  5. #25
    Stammgast
    Registriert seit
    24.10.2011
    Beiträge
    1.264

    Standard

    Zitat Zitat von Urwi Beitrag anzeigen
    Eine Lösung habe ich, aber ob das in jeder Konstellation funktioniert muss ich erst austesten:
    Ok, Union ist sicher eine Möglichkeit, das nimmt man aber nicht ohne Not, vor allem dann, wenn die Datenquelle tatsächlich unterschiedlich ist oder vielleicht aus völlig disjunkten Teilmengen besteht. (Kommt natprlich auf die Datenmengen an, tut nur weh, wenn sie groß sind)
    Dann machst Du da etwas-der Wechsel left /right (outer) join bzw. das Tauschen der Datenquellen Reihenfolge, das aufs Gleiche hinausläuft, was eeigentlich in Systemen, die kein full outer kennen als Workaround verwendet wird.
    Siehe hier z.B. https://stackoverflow.com/questions/...-join-in-mysql
    Damit bist Du vielleicht gar nicht so weit weg vom Verständnis eines Full Outer Joins, wie Du behauptest.

    Außerdem produziert der Union hier in diesem Fall unnötig viele (Zwischenergebnis)Daten, die nachher wieder rausfliegen (weil: Union enthält sozusagen ein Distinct)

    Also lieber per Join, dann hat der Optimizer die Chance, das beste draus zu machen.

    Ich hatte eher an sowas gedacht (ungetestet)
    Code:
    select x.*, nvl(x.AnyOfGivenDate, g.bearbeitetam) AnyOfGivenDateFinal from (
      select n.*, v.*, 
             nvl(n.bearbeitetam, v.bearbeitetam) AnyOfGivenDate
        from            tab_vn v
        full outer join tab_nn n  on v.bearbeitetam = n.bearbeitetam
                                                                              )x 
      full outer join tab_gd g  on x.AnyOfGivenDate = g.bearbeitetam
     order by 10, 2, 4, 6  -- order by noch auf die neue Spalte anpassen
    Vielleicht ist das auch Quatsch mit dem Oberen NVL, oder das ganze Statement ist Quatsch, hab da grad kein Kopf für.
    Gruß, defo

  6. #26

    Standard

    "full outer Join" suspekt.
    Vielleicht hilft eine visuelle Erklärung der JOIN-Typen weiter: https://www.codeproject.com/Articles...n-of-SQL-Joins

  7. #27
    Stammgast
    Registriert seit
    09.05.2012
    Beiträge
    135

    Standard

    Zitat Zitat von Markus Lahr Beitrag anzeigen
    Vielleicht hilft eine visuelle Erklärung der JOIN-Typen weiter: https://www.codeproject.com/Articles...n-of-SQL-Joins
    Danke, sehr interessant!

  8. #28
    Stammgast
    Registriert seit
    09.05.2012
    Beiträge
    135

    Standard

    Hallo defo,

    hier ist die "Not", möglichst schnell zu einer richtigen Lösung zu kommen. Die Anzahl der Datensätze bewegt sich insgesamt vielleicht auf 2000-3000 Stück, wobei diese noch extrem eingeschränkt werden, weil sie einer bestimmten Person zugeordnet werden. Die Verwendung der Abfrage ist beschränkt, weil die Daten in eine richtige Datenstruktur kommen soll.

    Danke
    Urwi

  9. #29
    Stammgast
    Registriert seit
    24.10.2011
    Beiträge
    1.264

    Standard

    Zitat Zitat von Urwi Beitrag anzeigen
    hier ist die "Not", möglichst schnell zu einer richtigen Lösung zu kommen. Die Anzahl der Datensätze
    Meine Anmerkungen sind grundsätzlicher Natur- wir sind ja in einem Forum. Wenn es andere Prioritäten gibt, als Speed oder was auch immer, kann man das natürlich nach Bedarf priorisieren.

    Hier ist eine bereinigte Version meines 2.Vorschlags:
    Code SQL:
    SELECT x.vorname, x.nachname, g.gebdat, x.AnyOfGivenDate
           -- nvl(x.AnyOfGivenDate, g.bearbeitetam) AnyOfGivenDateFinal 
      FROM (SELECT n.ID AS IDn, n.NACHNAME AS NACHNAME,
                   n.BEARBEITETAM AS BEARBEITETAMn, v.ID AS IDv,
                   v.VORNAME AS VORNAME, v.BEARBEITETAM AS BEARBEITETAMv,
                   nvl(n.bearbeitetam, v.bearbeitetam) AnyOfGivenDate
              FROM tab_vn v
              FULL OUTER JOIN tab_nn n
                ON v.bearbeitetam = n.bearbeitetam) x
      FULL OUTER JOIN tab_gd g
        ON x.AnyOfGivenDate = g.bearbeitetam
     ORDER BY 4, 1, 2, 3

    Wenn Du das mit anderen Lösungen auf Ergebnisebene vergleichen willst, wäre ein einfacher Ansatz 2 Statements mit Minus zu verbinden (wie bei union).
    Gruß, defo

  10. #30
    Stammgast
    Registriert seit
    09.05.2012
    Beiträge
    135

    Standard

    Hallo defo,

    bin heute nicht im Büro, werde aber morgen einmal deine Lösung ausprobieren.

    Danke
    Urwi

 

 
Seite 3 von 3 ErsteErste 1 2 3

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •