Bernd: Ergebnisse doppelt

Hi,

ich habe eine Query, bei der ich unter einer best. Voraussetzung eine Ergebnissmenge erhalte, die Tulpels doppelt aufführt.

  
select  
b.MID,  
t.AN,  
...  
FROM  
tabelle_b b  
JOIN tabelle_t t ON b.ID = t.ID  
JOIN tabelle_c c ON b.LID = c.KID  
JOIN tabelle_m m ON b.MID = m.MID  
JOIN tabelle_k k ON b.KID=k.KID  
LEFT JOIN tabelle_f f on m.MID = f.MID  
LEFT JOIN tabelle_a a on (b.LID = a.LID AND t.AN = a.AN )  
WHERE  
...  

Wenn in dieser Query in tabelle_b ein Eintrag steht, zu dem KEIN Eintrag in tabelle_t gehört, aber glechzeitig auch ein  Eintrag in tabelle_b steht, zu dem ein Eintrag in tabelle_t existiert, wird dieser doppelt aufgeführt.

Beispiel:

ID 5 in tabelle_b hat MID 10 aber keinen Eintrtag in tabelle_t
ID 50 in tabelle_b hat MID 10 und Eintrag t.ID = 20 in tabelle_t

Dann wird t.ID 20 doppelt aufgeführt mit allen sonstigen Werten, die ja für ID5 und ID50 ohnehin identisch sind.

Ich habe es mit

  • DISTINCT
  • LEFT JOIN
  • RIGHT JOIN

versucht, das brachte aber nicht den gewünschten Erfolg.

Bernd

  1. Tach!

    Ohne deine Datenstruktur nebst Beispieldaten und das was rauskommen soll zu kennen, ist es schwer, zielführende Tipps zu geben. Deswegen nur ein allgemeiner: Vielleicht kannt du einige Dopplungen wegbekommen, wenn du Tabellen, von denen du nur einen Wert benötigst, nicht joinst sondern als correlated subquery im SELECT-Teil einbindest.

    dedlfix.

  2. Was hat der Eintrag ohne Entsprechung in t da zu suchen?
    Ich tu mir auch nach mehrmaligem lesen immer noch schwer das zu verstehen.

    Du joinst da alles mögliche aneinander. Mach als erstes WHERE t.id = 20 rein und streich dann der Reihe nach JOINs und schau wann die ID nicht mehr auftaucht.
    Dann hast du evtl. einen Anhaltspunkt was da passiert.
    Wahrscheinlich hat eine der hinzugejointen Tabellen mehrere Einträge, die bzgl. des Kriteriums (ON ...) zu diesem einen Eintrag in t passen.

    1. Du joinst da alles mögliche aneinander. Mach als erstes WHERE t.id = 20 rein und streich dann der Reihe nach JOINs und schau wann die ID nicht mehr auftaucht.

      Hi,

      guter Tip.
      Bereits beim ersten Versuch taucht die ID nicht mehr doppelt auf.

        
      select  
      b.MID,  
      t.AN,  
      ...  
      FROM  
      tabelle_b b  
      JOIN tabelle_t t ON b.ID = t.ID  
      JOIN tabelle_c c ON b.LID = c.KID  
      JOIN tabelle_m m ON b.MID = m.MID  
      JOIN tabelle_k k ON b.KID=k.KID  
      LEFT JOIN tabelle_f f on m.MID = f.MID  
      WHERE  
      ...  
      
      

      Es fehlt hierbei:

        
      LEFT JOIN tabelle_a a on (b.LID = a.LID AND t.AN = a.AN )  
      
      

      Bernd

      1. Es fehlt hierbei:

        LEFT JOIN tabelle_a a on (b.LID = a.LID AND t.AN = a.AN )

        
        >   
          
          
        Und jetzt komme ich dahinter, was da passiert:  
          
        Der Eintrag ist in der tabelle\_a zwei mal  mit demselben AN-Wert eingetragen. Der LID-Wert muß identisch sein, das ist klar, aber zweimal derselbe AN-Wert, darauf muß man erstmal kommen.  
          
        Wenn ich aber nun mit  
          
        ~~~sql
          
        LEFT JOIN tabelle_a a on (b.LID = a.LID AND t.AN = a.AN AND t.spalte2 = a.spalte2 )  
        
        

        ein weiteres Selektionsmerkmal für die ON-Anweisung des JOINS hinzunehme, bekomme ich zwar den Doppeleintrag weg, erhalte aber in der Ergebnismenge nur NULL-Werte aus der a-Tabelle.

        Alle anderen Werte stimmen hingegen.

        Bernd

        1. Dann gibt es halt wahrscheinlich keine Entsprechung mit  t.spalte2 = a.spalte2 ?
          Deine Daten kennst nur du und die Kriterien was da wie zusammenpassen muss auch. Schau dir an was drin steht und obs einen Partner für JOIN gibt oder nicht.

          aber zweimal derselbe AN-Wert, darauf muß man erstmal kommen.

          Wie gesagt, deine Daten ;-)

          1. aber zweimal derselbe AN-Wert, darauf muß man erstmal kommen.
            Wie gesagt, deine Daten ;-)

            Nein. Preislisten von Lieferanten. AN-Wert ist in diesem Fall die Artikelnummer ;-)

            Dann gibt es halt wahrscheinlich keine Entsprechung mit  t.spalte2 = a.spalte2 ?

            Doch, schon. Spalte2 ist die Artikelbezeichnung.

            Deine Daten kennst nur du und die Kriterien was da wie zusammenpassen muss auch. Schau dir an was drin steht und obs einen Partner für JOIN gibt oder nicht.

            Das ists, was mich ansich wundert. Es gibt eigentlich 1 Übereinstimmung. Ich müsste gleich mal prüfen, ob sich nicht irgendwo ein Leerzeichen oder sowas eingeschmuggelt hat, aber ansich wäre 1 Übereinstimmung schon vorhanden. Wäre halt schöner, man hätte einen besseren Schlüssel zum JOIN als eine KundenID und eine Art.-Nr (bzw. nun plus einer Art.-Bezeichnung), aber die Artikeldaten ändern sich einfach zu oft zu grundlegen, als das ich die ID nehmen könnte oder mehrere hunderttausend Artikelkarteileichen mitführen will.

            Bernd

            1. Irgendwas scheint ja doppelt zu sein. Was es ist, kannst nur du rausfinden.
              Die Nummer sollte eigentlich eindeutig sein, so dass man nicht noch zusätzlich die Bezeichnung mit prüfen muss. Das riecht nach unsauberen Daten.

              Preislisten von Lieferanten.

              Dann frag doch den wie die Daten zu interpretieren sind.
              Und weise ihr darauf hin dass du mit einem fehlerhaften Datenmodell nicht umgehen kannst.

              Das ists, was mich ansich wundert. Es gibt eigentlich 1 Übereinstimmung.

              Du siehst doch was da noch alles mitkommt, dann hast du den zweiten Datensatz doch schnell identifiziert.

              Ich müsste gleich mal prüfen, ob sich nicht irgendwo ein Leerzeichen oder sowas eingeschmuggelt hat

              Deswegen ists auch nicht schön wenn man auf einen Namen joint. Was ändert sich da? Nur die Bezeichnung und der Artikel bleibt aber der selbe? Das würd ich trotzdem anders lösen als den Namen zu joinen. Sonst wird das nicht dein letzter Fehler dieser Art sein.

              aber die Artikeldaten ändern sich einfach zu oft zu grundlegen, als das ich die ID nehmen könnte oder mehrere hunderttausend Artikelkarteileichen mitführen will.

              Versteh ich nicht ganz. Gerade wenn sich nur die Artikeldaten ändern und man so Leichen vermeiden will (auch wenns nicht ganz so sauber ist) bleibt die ID doch die selbe.

              1. Ich hatte hier in in dem Thread bereits anklingen lassen, dass das verwendete Datenmodell suboptimal, ueberkompliziert ist.

                Ab zurueck ans Reissbrett und Kopf einschalten. :-)

                Gruss, Frank

  3. Hallo,

    ... die Tulpels doppelt aufführt.

    nur gut, dass das nicht auch noch mit den Rosels, den Nelkels und den Narzissels passiert. ;-)

    *scnr*
     Martin

    --
    "Mutti, hier steht, das Theater sucht Statisten. Was sind Statisten?" - "Das sind Leute, die nur rumstehen und nichts zu sagen haben." - "So wie Papa?"
    Selfcode: fo:) ch:{ rl:| br:< n4:( ie:| mo:| va:) de:] zu:) fl:{ ss:) ls:µ js:(