Announcement

Collapse
No announcement yet.

Datensatz wird mehrfach angezeigt und distinct geht nicht

Collapse
This topic is closed.
X
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Datensatz wird mehrfach angezeigt und distinct geht nicht

    Hallo,
    ich will meine Artikel daten ausgeben. Jetzt zeigt er mir aber 1 Artikel mehrfach an seihe Bild. Aber 1 Artikelnummer darf auch nur 1 mal angezeigt werden.

    Was ist falsch

    Hier der Code und das Bild.

    [highlight=sql]
    select a.artnr, a.KuBez1 ,a.Bez3
    ,al.Einh

    ,case when lg.LagNr='1' and lg.Mge='0' then 2
    when lg.LagNr='2' and lg.Mge='0' then 7
    else 1 end as LiefZt
    ,case when (case when awg.rabsz='0' Or awg.rabsz IS null then abw.abwpr
    when abw.AbwPr ='0' Or abw.AbwPr IS null then ROUND (av.preis - (av.preis * awg.rabsz/100),2)
    else ROUND (abw.abwpr - (abw.abwpr * awg.rabsz/100),2) end) Is null then av.preis
    else (case when awg.rabsz='0' Or awg.rabsz IS null then abw.abwpr
    when abw.AbwPr ='0' Or abw.AbwPr IS null then ROUND (av.preis - (av.preis * awg.rabsz/100),2)
    else ROUND (abw.abwpr - (abw.abwpr * awg.rabsz/100),2) end) end as Preis
    ,s.Sel4 , a.BarCd

    from M1.Artikel a
    left outer join M1.Lager lg on a.artnr=lg.artnr
    left outer join M1.abwartikeldaten abw on a.ArtNr=abw.artnr
    left outer join M1.artikellieferanten al on a.artnr=al.artnr
    left outer join M1.ArtikelSel s on a.artnr=s.ArtNr
    left outer join M1.ArtikelVk av on a.ArtNr=av.artnr
    left outer join M1.Warengruppen wg on a.wgrnr=wg.wgrnr
    left outer join M1.AdressenWgrRabatt awg on wg.wgrnr=awg.wgrnr
    where av.Vknr=0 and s.sel28=1 and al.stdkz=1 and a.wgrnr=awg.wgrnr and awg.adrnr='10800'

    [/highlight]


  • #2
    Hm da kann man eigentlich nur raten dass irgendwas mit den JOINS nicht stimmt. Versuch doch einfach mal nur einzelne Teile des Queries auszuführen um dann festzustellen welcher Teil dafür verantwortlich ist dass die IDs dupliziert angezeigt werden.
    Erste Frage die ich mir stellen würde:
    Gibt es in der Artikeltabelle einen zusammengesetzten Primärschlüssel? Sprich ist die ArtikelId alleine nicht eindeutig?
    Denn eigentlich kannst Du nur so per LEFT OUTER JOIN Duplikate bekommen.

    Du könntest mal das versuchen:

    [highlight=sql]
    select count(*), artnr
    from Artikel
    group by artnr
    having count(*) > 1
    [/highlight]

    Dort werden einfach alle artnr gezählt die mehr als einmal vorkommen. Solltest Du von diesem Query schon Ergebnisse bekommen ist die artnr schon nicht eindeutig.

    Comment


    • #3
      Komisch bei dem Code bringt er nix doppelt.

      [highlight=sql]
      select a.artnr, a.KuBez1 ,a.Bez3
      ,al.Einh, 3 as LiefZt,
      ROUND (av.preis - (av.preis * awg.rabsz/100), 2) as Preis
      ,s.Sel4 , a.BarCd
      from M1.Artikel a
      left outer join M1.artikellieferanten al on a.artnr=al.artnr
      left outer join M1.ArtikelSel s on a.artnr=s.ArtNr
      left outer join M1.ArtikelVk av on a.ArtNr=av.artnr
      left outer join M1.Warengruppen wg on a.wgrnr=wg.wgrnr
      left outer join M1.AdressenWgrRabatt awg on wg.wgrnr=awg.wgrnr
      where av.Vknr=0 and s.sel28=1 and al.stdkz=1 and a.wgrnr=awg.wgrnr and awg.adrnr='10800'

      [/highlight]

      Comment


      • #4
        Dann Versuch doch mal nur die anderen Tabellen alleine dazu zu joinen und schaue bei welcher Tabelle das passiert

        Comment


        • #5
          Hallo und gute morgen also ich bin voll am verzweifeln. Ich habe deine abfrage versucht einzubauen. Aber irgend wie kommt nur Fehler. Hier noch mal der Code und wie baue ich deine Abfrage ein das sieh geht.

          [highlight=sql]
          select a.artnr, a.KuBez1 ,a.Bez3
          ,al.Einh

          ,case when lg.LagNr='1' and lg.Mge='0' then 2
          when lg.LagNr='2' and lg.Mge='0' then 7
          else 1 end as LiefZt
          ,case when (case when awg.rabsz='0' Or awg.rabsz IS null then abw.abwpr
          when abw.AbwPr ='0' Or abw.AbwPr IS null then ROUND (av.preis - (av.preis * awg.rabsz/100),2)
          else ROUND (abw.abwpr - (abw.abwpr * awg.rabsz/100),2) end) Is null then av.preis
          else (case when awg.rabsz='0' Or awg.rabsz IS null then abw.abwpr
          when abw.AbwPr ='0' Or abw.AbwPr IS null then ROUND (av.preis - (av.preis * awg.rabsz/100),2)
          else ROUND (abw.abwpr - (abw.abwpr * awg.rabsz/100),2) end) end as Preis
          ,s.Sel4 , a.BarCd

          from M1.Artikel a
          left outer join M1.Lager lg on a.artnr=lg.artnr
          left outer join M1.abwartikeldaten abw on a.ArtNr=abw.artnr
          left outer join M1.artikellieferanten al on a.artnr=al.artnr
          left outer join M1.ArtikelSel s on a.artnr=s.ArtNr
          left outer join M1.ArtikelVk av on a.ArtNr=av.artnr
          left outer join M1.Warengruppen wg on a.wgrnr=wg.wgrnr
          left outer join M1.AdressenWgrRabatt awg on wg.wgrnr=awg.wgrnr
          where av.Vknr=0 and s.sel28=1 and al.stdkz=1 and a.wgrnr=awg.wgrnr and awg.adrnr='10800'

          [/highlight]

          Comment


          • #6
            Da wird dir jemand nur anhand des SQLs nicht wirklich weiterhelfen können. Das Problem liegt vermutlich eher an den Daten die anders strukturiert sind als du es erwartest uns aber natürlich komplett entgeht wenn wir nur das SQL sehen.

            Um das Problem zu lösen könntest du erst mal die unnötigen Bestandteil entfernen un ddas SQL vereinfachen. Zum Beispiel testest du bestimmte Tabellenwerte in der where Klausel und nicht in der on Klausel des joins. Damit verhalten sich die Joins wieder wie normale Innerjoins. Die entsprechenden Joins sollte du also auch im SQL wieder als Inner Join schreiben. Die Warengruppe Tabelle wird scheinbar nicht verwendet kannst du also rauswerfen.

            Wenn du es soweit vereinfacht hast das es besser versteh bar ist und du immer noch nicht das Problem siehst dann gibt doch einfach mal eine Wert aus jeder verwendeten Tabelle mit aus. Daran solltest du dann erkennen aus welcher Tabelle denn mehr als ein Datensatz kommt mit dem du nicht gerechnet hast und dafür sorgt das in deinem Ergebnis die Daten mehrfach angezeigt werden.

            Comment


            • #7
              Hi,

              mir fällt nur auf, dass Du teilweise Bedingungen für die gejointen Tabellen im Where Teil stehen hast. Nimm das mal raus und hänge es stattdessen mit AND an die entsprechende Bedingung im ON Teil.

              Gruß
              docendo discimus

              Comment


              • #8
                Originally posted by frauwue View Post
                Hi,

                mir fällt nur auf, dass Du teilweise Bedingungen für die gejointen Tabellen im Where Teil stehen hast. Nimm das mal raus und hänge es stattdessen mit AND an die entsprechende Bedingung im ON Teil.

                Gruß
                Das ist nur eine Glaubensfrage. Der Server wird egal welche Variante zum gleichen Execution Plan umwandeln.
                Ich würde beim JOIN lediglich die Kriterien reinschreiben die man zum joinen braucht (also z.B. a.Id = b.Id). Kriterien die sonst zutreffen müssen würde ich ins WHERE schreiben.

                Comment


                • #9
                  @fanderl: Wenn das wie hier ein Outer Join ist macht das einen Unterschied. Der null Satz der rechten Tabelle bei einem Left Outer Join den man bekommt wenn man keinen Treffer in dieser Tabelle hat würde durch die Bedingungen in der Where Klausel weg gefiltert werden. Was natürlich nicht gewollt ist sonst hätte man ja gleich einen Inner Join nehmen können Bei Outer Joins gehören die Bedingungen auf Tabellen die null sein können in die ON Klausel.

                  Comment


                  • #10
                    Danke erst mal habe schon alles getestet aber ich mach es noch mal.

                    Also ich habe jetzt alles rum und hin probiert bin einfach zu doof denke ich.

                    Wenn jemand mit den Code machen könnte wäre ich sehr dankbar würde auch was bezahlen für die hilfe da es sehr wichtig ist.
                    Zuletzt editiert von nw2000; 20.05.2011, 12:25.

                    Comment


                    • #11
                      Originally posted by fanderlf View Post
                      Das ist nur eine Glaubensfrage. Der Server wird egal welche Variante zum gleichen Execution Plan umwandeln.
                      Ich würde beim JOIN lediglich die Kriterien reinschreiben die man zum joinen braucht (also z.B. a.Id = b.Id). Kriterien die sonst zutreffen müssen würde ich ins WHERE schreiben.
                      Das stimmt absolut nicht - zumindest nicht bei Outer Joins, denn hier kann das ganz enorme Auswirkungen auf das Ergebnis haben.
                      Mehr dazu hier: http://weblogs.sqlteam.com/jeffs/arc...ed-tables.aspx

                      Dim
                      Zitat Tom Kyte:
                      I have a simple philosophy when it comes to the Oracle Database: you can treat it as a black box and just stick data into it, or you can understand how it works and exploit it as a powerful computing environment.

                      Comment


                      • #12
                        Hallo,
                        Originally posted by nw2000 View Post
                        ...Wenn jemand mit den Code machen könnte wäre ich sehr dankbar würde auch was bezahlen für die hilfe da es sehr wichtig ist.
                        Da das offensichtlich ein Angebot ist, dir etwas programmieren zu lassen, schließe ich den Thread hier.
                        Du kannst dein Angebot gerne unter Vermischtes/Jobs posten.

                        Gruß Falk
                        Wenn du denkst du hast alle Bugs gefunden, dann ist das ein Bug in deiner Denksoftware.

                        Quellcode ohne ein Mindestmaß an Formatierung sehe ich mir nicht an! Ich leiste keinen Privatsupport per Mail oder PN!

                        Comment

                        Working...
                        X