Sohail: Jion

Hallo,
ich habe ein sehr ernstes Problem.

Ich habe drei Tabellen, die ich über Join miteinender verknüpfen muss. Es gibt aber ein Problem, das ich nicht versrehen und lösen kann.

Also, die Select Anweisung sieht so aus.

Select Distinct UPPER(Substring(Branchen.Branche,1,1))From Branchen JOIN ShopBranchen ON Branchen.BranchenID=ShopBranchen.BranchenID JOIN ArtikelListe ON ShopBranchen.ShopID=ArtikelListe.ShopID Order by UPPER(Substring(Branchen.Branche,1,1))

(ShopBranchen-Tabelle hat die Felder ShopID,BranchenID)
(Branchen-Tabelle BranchenID,Branchen)
(ArtikelListe ShopID,Artikel,LKZ)

In allen Tabellen ist die ShopID Vorhanden. Die obere Anweisung funktioniert auch. Ich muss aber da noch etwas hizufügen. nähmlich:

ArtikelListe.LKZ<>-1

Da weiss ich nicht mehr weiter. Ich habe es so versucht.

Select Distinct UPPER(Substring(Branchen.Branche,1,1))From Branchen JOIN ShopBranchen ON Branchen.BranchenID=ShopBranchen.BranchenID JOIN ArtikelListe ON ShopBranchen.ShopID=ArtikelListe.ShopID

ON ArtikelListe.LKZ<>-1

Order by UPPER(Substring(Branchen.Branche,1,1))

da bekomme ich aber Fehlermeldung. Als Where-Klausel habe ich es auc versucht. Ich bekomme aber dann kein Treffer mehr:

Select Distinct UPPER(Substring(Branchen.Branche,1,1))From Branchen JOIN ShopBranchen ON Branchen.BranchenID=ShopBranchen.BranchenID JOIN ArtikelListe ON ShopBranchen.ShopID=ArtikelListe.ShopID

Where ArtikelListe.LKZ<>-1

Order by UPPER(Substring(Branchen.Branche,1,1))

Hat jemand eine Idee.

Für jeden Vorschlag bin ich dankbar.
Sohail

  1. Hallo,

    auch Hallo

    Probier doch mal das:

    SELECT DISTINCT UPPER(Substring(Branchen.Branche,1,1)) AS erg,
                    Branchen.BranchenID AS bID,
                    ShopBranchen.BranchenID AS sbID,
                    ShopBranchen.ShopID AS sID,
                    ArtikelListe.ShopID AS aID,
                    ArtikelListe.LKZ
           FROM     Branchen,ShopBranchen,ArtikelListe
           WHERE    bID = sbID
           AND      sID = aID
           AND      ArtikelListe.LKZ <> -1
           ORDER BY erg

    Für einen normalen JOIN sollte das reichen (wenn ich nicht was vergessen habe...)

    Gruß,
    paschef

    1. Hi,

      danke für deine Antwort.
      Ich habe deinen Vorschlag bei SQL versucht. Da kammen folgende Fehlermeldungen raus:

      Nachr.-Nr. 207, Schweregrad 16, Status 2
      Ungültiger Spaltenname 'bID'.
      Nachr.-Nr. 207, Schweregrad 16, Status 2
      Ungültiger Spaltenname 'sbID'.
      Nachr.-Nr. 207, Schweregrad 16, Status 2
      Ungültiger Spaltenname 'sID'.
      Nachr.-Nr. 207, Schweregrad 16, Status 2
      Ungültiger Spaltenname 'aID'.

      Vielen Dank nochmal.

      Sohail

      1. Hi,

        danke für deine Antwort.
        Ich habe deinen Vorschlag bei SQL versucht. Da kammen folgende Fehlermeldungen raus:

        Nachr.-Nr. 207, Schweregrad 16, Status 2
        Ungültiger Spaltenname 'bID'.
        Nachr.-Nr. 207, Schweregrad 16, Status 2
        Ungültiger Spaltenname 'sbID'.
        Nachr.-Nr. 207, Schweregrad 16, Status 2
        Ungültiger Spaltenname 'sID'.
        Nachr.-Nr. 207, Schweregrad 16, Status 2
        Ungültiger Spaltenname 'aID'.

        Dann probiers mal ohne Alias:

        SELECT DISTINCT UPPER(Substring(Branchen.Branche,1,1)),
                        Branchen.BranchenID,
                        ShopBranchen.BranchenID,
                        ShopBranchen.ShopID,
                        ArtikelListe.ShopID,
                        ArtikelListe.LKZ
               FROM     Branchen,ShopBranchen,ArtikelListe
               WHERE    Branchen.BranchenID = ShopBranchen.BranchenID
               AND      ShopBranchen.ShopID = ArtikelListe.ShopID
               AND      ArtikelListe.LKZ <> -1
               ORDER BY UPPER(Substring(Branchen.Branche,1,1))

        Und was für ein DB-System benutzt Du ?

        Gruß,
        paschef

        1. Hi,

          wenn ich es so schreibe, dann bekomme ich kein Distinct mehr.

          Sohail

          1. Hallo Sohail,

            wenn ich es so schreibe, dann bekomme ich kein Distinct mehr.

            wenn's Dir nur um die Buchstaben geht, und der Rest dahinter nicht wichtig ist, dann probiere GROUP BY (ungetestet...)

            SELECT          UPPER(Substring(Branchen.Branche,1,1)),
                            Branchen.BranchenID,
                            ShopBranchen.BranchenID,
                            ShopBranchen.ShopID,
                            ArtikelListe.ShopID,
                            ArtikelListe.LKZ
                   FROM     Branchen,ShopBranchen,ArtikelListe
                   WHERE    Branchen.BranchenID = ShopBranchen.BranchenID
                   AND      ShopBranchen.ShopID = ArtikelListe.ShopID
                   AND      ArtikelListe.LKZ <> -1
                   ORDER BY UPPER(Substring(Branchen.Branche,1,1))
                   GROUP BY UPPER(Substring(Branchen.Branche,1,1))

            Gruß,
            paschef

            1. Hi paschef, sohail

              wenn's Dir nur um die Buchstaben geht, und der Rest dahinter nicht wichtig ist, dann probiere GROUP BY (ungetestet...)

              SELECT          UPPER(Substring(Branchen.Branche,1,1)),
                              Branchen.BranchenID,
                              ShopBranchen.BranchenID,
                              ShopBranchen.ShopID,
                              ArtikelListe.ShopID,
                              ArtikelListe.LKZ
                     FROM     Branchen,ShopBranchen,ArtikelListe
                     WHERE    Branchen.BranchenID = ShopBranchen.BranchenID
                     AND      ShopBranchen.ShopID = ArtikelListe.ShopID
                     AND      ArtikelListe.LKZ <> -1
                     ORDER BY UPPER(Substring(Branchen.Branche,1,1))
                     GROUP BY UPPER(Substring(Branchen.Branche,1,1))

              Bitte nicht! Das ist sehr sehr MySQL proprietär und entspricht nicht
              der Logik hinter Group by (von der Performance mal ganz zu schweigen).
              Group by ist für Aggregatsfunktionen gedacht, also zb ein max
              soll über alle Spalten von Group By gezogen werden. Ausserdem müssen
              alle Spalten die nicht Aggregatsfunktionen sind in dem Group by stehen.
              Andere Datenbanken geben dir da sogar Syntaxfehler aus, MySQL nimmt
              dir für die restlichen Spalten einfach mehr oder weniger zufällig
              Werte aus den Records die zusammengefasst werden sollen (woher sollte
              es auch wissen welche davon du willst wenn sie verschieden sind).

              Zudem käme Group By vor den Order By.

              Wenn du die Spalten einfach nur im Where ansprechen willst, brauchst
              du sie auch nicht im Select anzugeben, da soll nur das hin was du
              als Output willst. Innerhalb der Query sind alle Spalten der angesprochenen
              Tabellen verfügbar, sie müssen einfach qualifiziert, dh mit Tabellennamen,
              angesprochen werden. Ausnahme davon sind Having, Group By und Order By
              weil die auf dem Result arbeiten. Da wird dann erst der Rest der
              Query ausgeführt und die Resultatetabelle noch gefiltert ohne Indexe
              und alles, deswegen auch langsamer.

              Gruss Daniela

              1. Hi,

                es knallt auch bei Group,

                Sohail

                1. Hi Sohail,

                  es knallt auch bei Group,

                  Wie gesagt, dein Statement ist ok, denn es liefert dir ein korrektes Ergebnis. Das dieses Ergebnis falsch ist, liegt daran, dass du irgendeine Bedingung, bzw. Verknuepfung deiner Tabelle nicht korrekt ins Statement eingebaut hast und wo dieser Fehler liegt, ist kaum zu sagen, wenn man sich die Datenbasis nicht mal genau angesehen hat.

                  Wenns bei mir hakt, setze ich mich an phpMyAdmin und baue da das Statement Stueck fuer Stueck zusammen. Das fuehrt dann in der Regel zu der Stelle, wo der Fehler eingebaut wurde.

                  Gruesse
                  Ralf

                  1. Hallo Ralf,

                    ich glaube, dass ich nicht ohne weiteres das LKZ-Feld miteinbeziehen kann. Wie auch.

                    etwa SO:

                    Select Distinct UPPER(Substring(Branchen.Branche,1,1))From Branchen JOIN ShopBranchen ON Branchen.BranchenID=ShopBranchen.BranchenID JOIN ArtikelListe ON ShopBranchen.ShopID=ArtikelListe.ShopID AND ArtikelListe.LKZ<>-1 Order by UPPER(Substring(Branchen.Branche,1,1))

                    da bezieht sich ArtikelListe.LKZ<>-1 auf nichts, deswegen bekomme ich auch 0 Treffer

                    So geht es auch nicht:

                    Select Distinct UPPER(Substring(Branchen.Branche,1,1))From Branchen JOIN ShopBranchen ON Branchen.BranchenID=ShopBranchen.BranchenID JOIN ArtikelListe ON ShopBranchen.ShopID=ArtikelListe.ShopID Where ArtikelListe<>-1 Order by UPPER(Substring(Branchen.Branche,1,1))

                    da bekomme ich kein Treffer.

                    Ja soviel anders kann man dies nicht kombinieren.
                    Wie gesagt ohne die Bedingung ArtikelListe<>-1 kommt dabei etwas raus, aber damit nichts.

                    Ich bedanke mich trotzdem.
                    Sohail

                    1. Hallo Sohail

                      Ja soviel anders kann man dies nicht kombinieren.

                      So mein ich das auch nicht, sondern dass du dein Statement stueckweise aufbaust und immer wiede das Ergebnis kontrollierst.

                      1.Select * from Branchen
                      (Distinct UPPER(Substring(Branchen.Branche,1,1)) usw. weglassen) und gucken was kommt

                      2. Select * from branchen inner join shopbranchen ON branchen.branchenid = shopbranchen.branchenid

                      3.2. Select * from branchen inner join shopbranchen ON branchen.branchenid = shopbranchen.branchenid innerjoin artkelliste on shopbranchen.shopid = artieklliste.shopid Where artikelliste.lkz <> -1
                      Spaetestens hier muesstest du ja ein brauchbares, wenn auch noch zu grosses Ergebnis bekommen und beurteilen koennen, ob diese Tabelle ueberhaupt das enthaelt, was du benoetigst. Wenn nicht, kannst du dir den Rest sparen und falls es passt, kannst du von hier das Statement weiter aufbohren, bis du zu der Stelle kommst, wo die zurueckgegebene Tabelle deinen Vorstellungen und denen der Datenbasis ;o) entspricht.

                      Gruss
                      Ralf

                    2. Moin!

                      So geht es auch nicht:

                      Select Distinct UPPER(Substring(Branchen.Branche,1,1))From Branchen JOIN ShopBranchen ON Branchen.BranchenID=ShopBranchen.BranchenID JOIN ArtikelListe ON ShopBranchen.ShopID=ArtikelListe.ShopID Where ArtikelListe<>-1 Order by UPPER(Substring(Branchen.Branche,1,1))

                      da bekomme ich kein Treffer.

                      Ja soviel anders kann man dies nicht kombinieren.
                      Wie gesagt ohne die Bedingung ArtikelListe<>-1 kommt dabei etwas raus, aber damit nichts.

                      Was kommt raus? Doch nur eine Liste von Buchstaben, welche in der Distinct-Spalte enthalten sind.

                      Wenn du mit WHERE arbeitest, muß das Feld, welches abgefragt werden soll, auch dann vorhanden sein, wenn du kein WHERE benutzt. Da du aber nur eine Spalte selektierst, und die nicht LKZ heißt, kannst du logischerweise die Spalte LKZ nicht abfragen.

                      Der Tipp mit phpMyAdmin ist wirklich gut: Erstmal eine Tabelle selektieren (dabei mit * arbeiten). Gucken, was rauskommt. Dann einen JOIN dranhängen, gucken, was rauskommt. Nächsten JOIN dran, und gucken, was rauskommt. Dann DISTINCT einfügen und gucken, was rauskommt. Dann mit WHERE filtern und gucken, was rauskommt.

                      Du hast dank "DISTINCT" übrigens noch ein anderes Problem, nämlich das der Vermischung. DISTINCT faßt ja alle Spalten gleichen Inhalts zu einem Eintrag zusammen. Was passiert, wenn du zwei Spalten hast, die per Distinct zusammenfallen, deren LKZ aber unterschiedlich ist? Da du lediglich den ersten, großgemachten Buchstaben per DISTINCT zusammenfaßt, gibts ja nur 26 Ergebniszeilen, aber sicherlich mehr als 26 Einträge mit unterschiedlichen LKZ. Du hast also das Problem, daß deine LKZ durchaus falsch sind bzw. nicht so ganz richtig.

                      Guck mit phpmyadmin (oder sonst einem Tool), welche Einzel- und Sammel-Ergebnisse deine Abfragen bringen - erst dann siehst du, daß du vermutlich die falsche Frage an die Datenbank stellst.

                      - Sven Rautenberg

                      1. Hi Sven

                        Was kommt raus? Doch nur eine Liste von Buchstaben, welche in der Distinct-Spalte enthalten sind.

                        Wenn du mit WHERE arbeitest, muß das Feld, welches abgefragt werden soll, auch dann vorhanden sein, wenn du kein WHERE benutzt. Da du aber nur eine Spalte selektierst, und die nicht LKZ heißt, kannst du logischerweise die Spalte LKZ nicht abfragen.

                        ehm, hä? das trifft für Having zu, aber doch nicht für Where, Where arbeitet
                        ja nicht mit dem Resultset.

                        Du hast dank "DISTINCT" übrigens noch ein anderes Problem, nämlich das der Vermischung. DISTINCT faßt ja alle Spalten gleichen Inhalts zu einem Eintrag zusammen. Was passiert, wenn du zwei Spalten hast, die per Distinct zusammenfallen, deren LKZ aber unterschiedlich ist? Da du lediglich den ersten, großgemachten Buchstaben per DISTINCT zusammenfaßt, gibts ja nur 26 Ergebniszeilen, aber sicherlich mehr als 26 Einträge mit unterschiedlichen LKZ. Du hast also das Problem, daß deine LKZ durchaus falsch sind bzw. nicht so ganz richtig.

                        Das Distinct wirkt erst auf dem Resultset, deswegen ist es ja "böse" also
                        aufwändig. Die Where-Clause wirkt bereits viel früher, das Problem gäbe
                        es wenn er Group By verwenden würde und das Löschding im ResultSet wäre.

                        Gruss Daniela

  2. Hi,
    Wo hast du die Where Klausel denn hingesetzt?

    Select Distinct UPPER(Substring(Branchen.Branche,1,1))From Branchen JOIN ShopBranchen ON Branchen.BranchenID=ShopBranchen.BranchenID JOIN ArtikelListe ON ShopBranchen.ShopID=ArtikelListe.ShopID

    WHERE ArtikelListe.LKZ<>-1

    Order by UPPER(Substring(Branchen.Branche,1,1))

    So sollte die eigentlich an der richtigen Stelle sitzen und wenn die Bedingung ueberhaupt erfuellbar ist, auch ein Ergebnis liefern.

    Der Vorschlag von Jion ist dir afaik nur bedingt nuetzlich, auch wenn er ein Ergebnis liefert, denn wenn ich mich recht erinnere, werden auf diesem Wege alle Datensaetze selektiert und dann wird bei all diesen Datensaetzen ueberprueft, ob die Bedingung zutrifft. Join ist die durchaus performantere Loesung, denn hier werden von vornherein Schnittmengen gebildet und nur diese Datensaetze werden dann auch selektiert.

    Gruesse
    Ralf

    1. Sorry. Vorschlag von paschef war gemeint und jion (join) ist das topic.

    2. Hallo Ralf,

      Der Vorschlag von Jion ist dir afaik nur bedingt nuetzlich, auch wenn er ein Ergebnis liefert, denn wenn ich mich recht erinnere, werden auf diesem Wege alle Datensaetze selektiert und dann wird bei all diesen Datensaetzen ueberprueft, ob die Bedingung zutrifft. Join ist die durchaus performantere Loesung, denn hier werden von vornherein Schnittmengen gebildet und nur diese Datensaetze werden dann auch selektiert.

      Da lasse ich mich gerne belehren, aber ich denke, daß hängt vom DB-System ab. Laut MySQL-Manual wird die Idee von mir intern genauso behandelt wie ein JOIN. Erst bei LEFT (OUTER,INNER etc...) gibt's Unterschiede.

      Aber wie gesagt: Wenn ich hier Hinweise zur Performance-Steigerung kriegen kann, dann immer her damit ;-)

      Gruesse
      Ralf

      Gruß,
      paschef

      1. Hallo Paschef,

        genauso behandelt wie ein JOIN. Erst bei LEFT (OUTER,INNER etc...)

        Soweit ich weiss wird ein JOIN bei MySQL defaultmaessig als inner join behandelt, waehrend left und right outer joins darstellen. Von daher verstehe ich die Argumentation des Manuals nicht ganz.

        Gruesse
        Ralf

        1. Hallo Ralf

          Soweit ich weiss wird ein JOIN bei MySQL defaultmaessig als inner join behandelt, waehrend left und right outer joins darstellen. Von daher verstehe ich die Argumentation des Manuals nicht ganz.

          Ich habe im O'Reilly-Buch zu MySQL/mSQL mal gelesen, daß die Variante ohne JOIN nach einer "MySQL effektiv erscheinenden" Weise ausgewertet wird. Bei Angabe von JOIN wird dann die vom User angegebene Reihenfolge eingehalten. Da ich diese Einstellung "was die Datenbank kann, kann sie schnell" bei MySQL meist sehr performant umgesetzt finde, war ich bislang immer sehr zufrieden. Mit den geeigneten Indizes dazu, hat MySQL bei uns auch mal im direkten Vergleich mit Oracle und MSSQL für einen ähnlichen Fall (über 15 tables) besser abgeschnitten.

          Und zusätzlich finde ich die Variante ohne JOIN um Längen übersichtlicher.

          Verunsichern wir eigentlich gerade Sohail ? ;-)

          Gruß,
          paschef

          1. Hallo Paschef,

            Variante ohne JOIN nach einer "MySQL effektiv erscheinenden" Weise >ausgewertet wird. Bei Angabe von JOIN wird dann die vom User >angegebene Reihenfolge eingehalten. Da ich diese Einstellung "was

            Oweh :o). Mir hat gerade vor zwei Wochen der SQL Dozent was anderes erzaehlt. Damit haetten wir jetzt drei Ansichten. Deine, Danielas (irgendwo dazwischen)und das was mir erzaehlt wurde. Beim Zivildienst im Krankenhaus hiess es bei solchen Geschichten immer nur:
            'Wenn zwei Aerzte einer Meinung sind, ist einer davon kein Arzt'

            Und zusätzlich finde ich die Variante ohne JOIN um Längen übersichtlicher.

            Fand ich auch bisher immer. Nachdem ich mich allerdings ausgiebigst mit JOIN beschaeftigt hatte, ist mir das inzwischen ziemlich ans Herz gewachsen und die Performanceaussage hat dann den Ausschlag gegeben.

            Verunsichern wir eigentlich gerade Sohail ? ;-)

            Ich hoffe nicht, der sagt gar nix mehr :o)

            Gruesse
            Ralf

            1. Hallo Ralf,

              'Wenn zwei Aerzte einer Meinung sind, ist einer davon kein Arzt'

              Dann soll Daniela entscheiden ;-)

              Ich werde heute mal jemanden in der Uni fragen (Lehrstuhl für Datenbanken, sehr fit in B- und anderen Bäumen).

              Gruß,
              paschef

              1. Hi Paschef

                Hallo Ralf,
                Ich werde heute mal jemanden in der Uni fragen (Lehrstuhl für Datenbanken, sehr fit in B- und anderen Bäumen).

                Oh ja. Mach mal. Vielleicht kannst du ja noch mal Bescheid geben, was dabei rum gekommen ist. Wuerde mich ja inzwischen doch sehr interessieren.

                Gruesse
                Ralf

    3. Hi Ralf, Sohail

      Order by UPPER(Substring(Branchen.Branche,1,1))

      Der hier könnte Ärger geben. Das was du auflistest ist nicht im
      Resultat, resp, es ist da, aber ob die Datenbank das erkennt. Besser
      und sicherer ist, der Spalte einen Namen zu geben (mit as) direkt nach
      dem Select und dann Order by Spaltenname.

      So sollte die eigentlich an der richtigen Stelle sitzen und wenn die Bedingung ueberhaupt erfuellbar ist, auch ein Ergebnis liefern.

      Sohail, könntest du dazu noch die genaue Fehlermeldung liefern, es sieht
      richtig aus.

      Der Vorschlag von Jion ist dir afaik nur bedingt nuetzlich, auch wenn er ein Ergebnis liefert, denn wenn ich mich recht erinnere, werden auf diesem Wege alle Datensaetze selektiert und dann wird bei all diesen Datensaetzen ueberprueft, ob die Bedingung zutrifft. Join ist die durchaus performantere Loesung, denn hier werden von vornherein Schnittmengen gebildet und nur diese Datensaetze werden dann auch selektiert.

      Ja und Nein, das betrifft vorallem MySQL (mir wäre kein anderes DBMS bekannt)
      und auch das nur in alten Versionen, das wird inzwischen auch optimiert, allerdings haben
      viele Provider noch antike Versionen.

      Gruss Daniela

      1. Hi,

        wie schon beschrieben, da sind drei Tabellen. Ich muss da eine Alfabetische Auflistung machen, bei Branchen, die einem shop zugewiesen sind und irgend welche Arrtikeln auch eingetragen worden sind und diese artikeln auch keine Lösch-kennzeichen(LKZ) -1 haben.

        Mein Problem ist, dass ich nirgendwo die Bedingung AritikelListe.LKZ<>-1 unterbringen kann. da bekomme ich entweder Fehlermeldungen wie:

        Nachr.-Nr. 156, Schweregrad 15, Status 1
        Falsche Syntax bei Schlüsselwort 'ON'.

        oder 0 Treffer.

        Sohail

        1. Hi Sohail

          Mein Problem ist, dass ich nirgendwo die Bedingung AritikelListe.LKZ<>-1 unterbringen kann. da bekomme ich entweder Fehlermeldungen wie:

          Nachr.-Nr. 156, Schweregrad 15, Status 1
          Falsche Syntax bei Schlüsselwort 'ON'.

          Jap, der Syntax müsste heissen (on Verknüpfung and Bedingung) und
          nicht on Verknüpfung on Bedingung. Allerdings wird davon im MySQL
          Manual abgeraten. Es ist nicht schlimm von der Performance her. Es
          ist einfach unsauber weil da wirklich nur die Verknüpfungsbedingungen
          hingehören. Das Resultat müsste allerdings identisch sein zu
          dem was bei den wheres rauskommt. Bist du sicher das deine Daten
          ok sind?

          Gruss Daniela

    4. Hi,

      das ist ja das Problem. So bekomme ja kein Ergebnis raus, und ich weiss nicht viran es liegt.

      B
      C
      D
      G
      I
      K
      P
      R
      S
      V
      W

      da sollete R nicht sein, weil da LKZ=-1 ist.

      Sohail

      1. Hi,

        da sollete R nicht sein, weil da LKZ=-1 ist.

        aber das heisst doch, dass das Statement an sich ok ist und irgendwas an deinen Bedingungen, bzw. Verknuepfungen nicht stimmt. Das ist natuerlich schwer zu sagen, wenn man die Struktur nicht genau kennt. Hast du mal versucht, dass Statement zu zerhacken und die Selects stueckweise auszufuehren? Vielleicht kannst du so die Stelle eingrenzen, an der es hakt.

        Gruesse
        Ralf

    5. Hallo Archivare,

      hier wärs sicher sinnvoll, vor der Archivierung den Dreher in der Archiv-Klasse zu beseitigen.

      Gruß

      Tom

  3. Hallo,

    Also, die Select Anweisung sieht so aus.

    Select Distinct UPPER(Substring(Branchen.Branche,1,1))From Branchen JOIN ShopBranchen ON Branchen.BranchenID=ShopBranchen.BranchenID JOIN ArtikelListe ON ShopBranchen.ShopID=ArtikelListe.ShopID Order by UPPER(Substring(Branchen.Branche,1,1))

    (ShopBranchen-Tabelle hat die Felder ShopID,BranchenID)
    (Branchen-Tabelle BranchenID,Branchen)
    (ArtikelListe ShopID,Artikel,LKZ)

    In allen Tabellen ist die ShopID Vorhanden. Die obere Anweisung funktioniert auch. Ich muss aber da noch etwas hizufügen. nähmlich:

    ArtikelListe.LKZ<>-1

    Ich weiss nicht ob ich dich richtig verstanden habe,
    aber könntest du 'distinct' nicht durch 'group by' ersetzen!?
    Vielleicht liefert ja folgendes Statement das von dir gewünschte Ergebnis!

    SELECT UPPER(Substring(Branchen.Branche,1,1))AS ErsterBst
    FROM Branchen JOIN ShopBranchen
    ON Branchen.BranchenID = ShopBranchen.BranchenID
    JOIN ArtikelListe
    ON Artikelliste.ShopID = ShopBranchen.ShopID
    WHERE Artikelliste.LKZ<>-1
    GROUP BY UPPER(Substring(Branchen.Branche,1,1))
    ORDER BY UPPER(Substring(Branchen.Branche,1,1))

    Gruß
    Stefan

    1. Hallo Stefan,

      Danke.

      Da bekomme ich auch 0 Treffer.

      Wie schon erwähnt, ist etwas an LKZ<>-1 nicht in Ordnung:

      Branchen_Tabelle:
      --------------------
      |BranchenID|Branchen |
      ---------------------

      ShopBranchen_Tabelle:
      --------------------
      |ShopID|BranchenID |
      --------------------

      ArtikelListe_Tabelle:
      ------------------------
      |ShopID|ArtikelID |LKZ |
      ------------------------

      Wie du siehst, hat das LKZ-Feld überhaupt keine Beziehung zu den anderen Felder und ich glaube, dass das Problrm da liegt. Zwischen Branchen und ArtikelListe auch.

      Sohail

      1. Hi Sohail

        Wie schon erwähnt, ist etwas an LKZ<>-1 nicht in Ordnung:

        Branchen_Tabelle:

        |BranchenID|Branchen |

        ShopBranchen_Tabelle:

        |ShopID|BranchenID |

        ArtikelListe_Tabelle:

        |ShopID|ArtikelID |LKZ |

        Wie du siehst, hat das LKZ-Feld überhaupt keine Beziehung zu den anderen Felder und ich glaube, dass das Problrm da liegt. Zwischen Branchen und ArtikelListe auch.

        Das hat doch eine wunderbare Beziehung zu den anderen, es gehört zum
        Datensatz der über ShopID und ArtikelID eindeutig identifiziert wird.

        Zu dem Datensatz kommst du über Branchen.BranchenID = ShopID.BranchenID
        und danach weiter mit ShopBranchen.ShopID = ArtikelListe.ShopID.

        Nur was willst du überhaupt machen, willst du alle Branchen ausschliessen
        wo ein Artikel gelöscht wurde? Oder solche Branchen deren Shops nur
        keine ungelöschten Shops mehr beinhalten (danach sieht deine Query aus).

        Die Verknüpfung ist ok, entweder deine Daten sind falsch, oder da
        stimmt nicht überein was du sagst du willst(SQL) und was du wirklich
        möchtest.

        Gruss Daniela

        1. Hallo Daniela,

          Branchen_Tabelle:
           --------------------
           |BranchenID|Branchen |
           ---------------------
           |1         |Abcdf    |
           |2         |B        |
           |3         |C        |
           |4         |Akkuu    |
           |5         |Bpppp    |
           ---------------------

          ShopBranchen_Tabelle:
           --------------------
           |ShopID|BranchenID |
           --------------------
           |20    |2          |
           |150   |5          |
           |10    |2          |
           |2     |3          |
           |30    |2          |
           -------------------

          ArtikelListe_Tabelle:
           ------------------------
           |ShopID|ArtikelID |LKZ |
           ------------------------
           |150   |4         |    |
           |150   |2         |    |
           |150   |5         |    |
           |20    |4         | -1 |
           |20    |3         | -1 |
           |10    |2         |    |
           |10    |1         |    |

          jetzt mussen alle Branchen aufgelistet werden, die obere Bedingungen habne und in Artikelliste LKZ<>-1 haben.

          Ich hoffe, ich könnte es richtig erklären.

          Sohail

          1. Hallo Sohail

            Branchen_Tabelle:

            |BranchenID|Branchen |

            |1         |Abcdf    |
            |2         |B        |
            |3         |C        |
            |4         |Akkuu    |
            |5         |Bpppp    |

            ShopBranchen_Tabelle:

            |ShopID|BranchenID |

            |20    |2          |
            |150   |5          |
            |10    |2          |
            |2     |3          |
            |30    |2          |

            ArtikelListe_Tabelle:

            |ShopID|ArtikelID |LKZ |

            |150   |4         |    |
            |150   |2         |    |
            |150   |5         |    |
            |20    |4         | -1 |
            |20    |3         | -1 |
            |10    |2         |    |
            |10    |1         |    |

            jetzt mussen alle Branchen aufgelistet werden, die obere Bedingungen habne und in Artikelliste LKZ<>-1 haben.

            Das Problem könnte daran liegen, dass das LKZ nicht immer gefüllt ist. Ersetze die leeren Einträge einmal durch 0.

            Gruß
            Stefan

            1. Hallo Stefan,

              das glaube ich eigentlich weniger. Hast du schon mal so ein Fall gehabt?

              Danke
              Sohail

              1. Hallo Sohail,

                das glaube ich eigentlich weniger. Hast du schon mal so ein Fall gehabt?

                Ich weiss nicht, wie sich mySQL in so einem Fall verhält.
                Ich arbeite viel mit Access und MS-SQL-Server.
                Und dort würde, falls es sich bei dem Feld LKZ um den Feldtyp INT handelt durch die Abfrage auf LKZ<>-1 Datensätze durchrutschen, bei denen LKZ den Wert NULL besitzt.

                Um das zu testen, könntest du auch deine SQL-Anweisung ändern:
                SELECT ...
                WHERE LKZ<>-1 OR LKZ is null
                ...

                Gruß
                Stefan

                1. Hallo Stefan,

                  ich glaube da tut sich was. Jetzt bekomme ich mit "OR LKZ is null"
                   die Korrekte Buchstaben raus. Ich muss jetzt sehen, ob ich auch an andere Stelle deinen Vorschlag einbauen kann.

                  Danke.
                  Sohail

                  1. Hallo Sohail,

                    ich glaube da tut sich was. Jetzt bekomme ich mit "OR LKZ is null"
                    die Korrekte Buchstaben raus. Ich muss jetzt sehen, ob ich auch an andere Stelle deinen Vorschlag einbauen kann.

                    na prima!

                    Trotzdem solltest du nochmal dein Daten-Modell überprüfen und dir darüber klar werden, ob das Ergebnis tatsächlich den Sachverhalt widergibt, den du darstellen möchtest. Ggf. müsstest du das Datenmodell oder aber dein SQL-Statement entsprechend verändern.
                    Dazu haben Daniela und meine Wenigkeit dir ja schon Möglichkeiten aufgezeigt.

                    cu
                    Stefan

          2. Hi Sohail

            jetzt mussen alle Branchen aufgelistet werden, die obere Bedingungen habne und in Artikelliste LKZ<>-1 haben.

            Ich hoffe, ich könnte es richtig erklären.

            Bei deiner jetzigen Query fliegen Branche 1 und 4 gleich beim ersten
            Join raus, ich denke du willst die drin lassen, deswegen n left
            outer join, alle Datensätze von links, wenn es rechts was hat, liefere
            mir auch die Daten dazu.

            Danach fliegt Branche 3 raus weils wiederum keine passenden Datensätze
            auf der Shop_Artikel Tabelle hat.

            Bleiben noch 2 und 5 die eigentlich beide auch Datensätze haben
            wo deine Spalte nicht -1 ist.

            Die Frage die mir noch einfällt dabei ist, sollen Branchen raus
            mit einem -1 Eintrag oder nur solche die nur -1er Einträge haben?

            Gruss Daniela

            1. Hallo Daniela,

              alle Datensätze, die LKZ=-1 haben, sollen nicht angezeigt werden, deswegen die Bedingung ArtikelListe<>-1 muss irgendwie rein.

              Danke.
              Sohail

              1. Hi Sohail

                alle Datensätze, die LKZ=-1 haben, sollen nicht angezeigt werden, deswegen die Bedingung ArtikelListe<>-1 muss irgendwie rein.

                a) Alle Datensätze (also alle kombinationen) oder b) alle Brachen mit -1?
                In ersterem Fall wären Brachen noch da wenn sie nicht nur -1er Datensätze
                hätten, in letzterem Fall reicht ein einziger -1er Datensatz um die Branche
                rauszuwerfen.

                Ich habs immer noch nicht verstanden weil du Datensätze
                in deiner Ausgabe zusammenfasst zu einem Ergebnis. Deswegen ohne
                jeden Zweifel nochmal a od b. Falls b, erkläre wie schon im anderen
                Posting von mir als aw auf Stefan was ganz genau das Löschungsflag
                bedeutet, weil dann wirds komplizierter und n besseres Verständnis
                bringt uu n Datenmodell wo das einfacher geht, oder sogar uu nur
                mit dem geht.

                Falls es letzteres ist, das wäre n Fall für Subselects was MySQL nicht
                kann, mit etwas getrickse gehts unter umständen trotzdem noch, aber
                ist dann kompliziert und aufwändig.

                Gruss Daniela *heute sehr schwer von Begriff ist*

                1. Hallo Daniela,

                  es ist so. Es muss erst eine Alfabetische Auflisting von Alle Branchen her, die mit Bezihung zu einem Shop stehen und auch der Shopbetreiber in seinem Shop irgendwelche Artikel hat. Das heisst, die Shops, die Keine Artikel haben oder doch und LKZ=-1 haben mussen nicht angezeigt werdrn.
                  SO:

                  B D F P R S V

                  Dann beim Anklick der Buchstaben(z.B. B), werden alle Branchen, die mit B anfangen angezeigt.

                  Bürobedarf
                  Büroeinrichtungen
                  Büromöbel

                  dann beim anklick einer diesen Branchen wird der Shop selbst angezeigt.

                  Das klappt auch wunderbar ohne die Bedingung ArtikelListe.LKZ<>-1.

                  Jeztiger Stand:

                  Select UPPER(Substring(Branchen.Branche,1,1)) From Branchen JOIN ShopBranchen ON Branchen.BranchenID=ShopBranchen.BranchenID JOIN ArtikelListe ON ArtikelListe.ShopID=ShopBranchen.ShopID GROUP BY UPPER(Substring(Branchen.Branche,1,1))Order by UPPER(Substring(Branchen.Branche,1,1))

                  Ich möchte dich auch gerne bitten, mir etwas über Outer und inner Join zu erzählen. Ich habe es nicht ganz verstanden.

                  Danke
                  Sohail

                  1. Hi Sohail

                    es ist so. Es muss erst eine Alfabetische Auflisting von Alle Branchen her, die mit Bezihung zu einem Shop stehen und auch der Shopbetreiber in seinem Shop irgendwelche Artikel hat. Das heisst, die Shops, die Keine Artikel haben oder doch und LKZ=-1 haben mussen nicht angezeigt werdrn.
                    SO:

                    ich nehme jetzt einfach mal an, solange nicht alle Artikel eines Shops -1
                    haben, darf der Shop angezeigt werden. Nur, beim besten willen, das
                    ist es was deine Query eigentlich tun sollte was ich verstehe.
                    Bei deinen Beispieldaten müsste sie dir einen Teil drin lassen.
                    Kannst du irgendwo die Create Statements hochstellen und n Dump
                    von deine Daten (Ausschnitt reicht), damit man ausprobieren kann?

                    B D F P R S V

                    Deine Query sollte genau das erzeugen glaub ich?

                    Das klappt auch wunderbar ohne die Bedingung ArtikelListe.LKZ<>-1.

                    Kannst du mal das Feld mit in die Liste nehmen und den Distinct raus?
                    Einfach das man sieht ob es überhaupt Records gäbe die dem entsprechen.
                    Also Select bisheriges feld, ArtikelListe.LKZ und die Where clause mal
                    raus. Den Group by bitte auch raus, der gehört da eh nicht hin.
                    Ideal wäre auch, wenn du noch die ShopID auch ausgeben könntest dazu.
                    Falls keine Records in dem Output sind die was anderes als -1 haben
                    solltest du deinen Datenbestand prüfen ob der wirklich io ist.

                    Dann damit ausgeschlossen ist das dein Order by doch schuld ist, gib
                    der ersten Spalte (dem Upper...) mit as einen Namen und verwende
                    den im Order by.

                    Select UPPER(Substring(Branchen.Branche,1,1)) as blub, ShopBranchen.ShopID, ArtikelListe.TKZ
                      From Branchen
                      JOIN ShopBranchen
                           ON (Branchen.BranchenID=ShopBranchen.BranchenID)
                      JOIN ArtikelListe
                           ON (ArtikelListe.ShopID=ShopBranchen.ShopID)
                     Order by blub

                    Ich möchte dich auch gerne bitten, mir etwas über Outer und inner Join zu erzählen. Ich habe es nicht ganz verstanden.

                    Ist eigentlich ganz einfach, ein inner Join sagt, es muss zu einem
                    Record von links zwingend auch einen passenden Record rechts haben
                    damit der linke Teil überhaupt in Frage kommt.

                    Outer Join heisst, es muss nicht zwingend auf beiden Seiten etwas haben,
                    also Datensätze der linken Tabelle werden auch mit in die Auswahl genommen
                    wenn in der rechten Tabelle kein passender Datensatz ist. Dann wird
                    diese Seite einfach mit null aufgefüllt.

                    Bsp: Tab 1:
                         1    1
                         1    2

                    Tab 2:
                         2    blub
                         3    asdf

                    from tab1 inner join tab2 on (tab1.sp2 = tab2.sp1):
                    1 2 blub, weil nur zu da passen tab1 und tab2 zusammen

                    from tab1 left outer join on (tab1.sp2 = tab2.sp1):
                    1 1 null
                    1 2 blub

                    from tab1 right outer join on(tab1.sp2 = tab2.sp1):
                    1    2 blub
                    null 3 asdf

                    jeweils tab1.sp1, tab1.sp2 und tab2.sp2 der reihe nach, nur der join
                    teil aufgelistet.

                    Gruss Daniela

                    1. Hallo Daniela, Hallo Stefan

                      Vielen Dank für eure Zeit und Hilfe. Ich habe es endlich hingekrigt.
                      Es funktioniert einwandfrei.

                      Danke nochmals für eure Hilfe.

                      Sohail

      2. Hallo Sohail,

        Wie schon erwähnt, ist etwas an LKZ<>-1 nicht in Ordnung:

        Branchen_Tabelle:

        |BranchenID|Branchen |

        ShopBranchen_Tabelle:

        |ShopID|BranchenID |

        ArtikelListe_Tabelle:

        |ShopID|ArtikelID |LKZ |

        Wie du siehst, hat das LKZ-Feld überhaupt keine Beziehung zu den anderen Felder und ich glaube, dass das Problrm da liegt. Zwischen Branchen und ArtikelListe auch.

        Ich hatte mir schon gedacht, dass an deinen DB-Modell etwas nicht stimmt. Es fehlen wohl zwei Tabellen: eine in der die Shops eindeutig sind und eine in der die Artikel eindeutig sind.
        Das könnte so aussehen:

        Branchen:
        BranchenID;Branchen

        ShopBranchen:
        BranchenID;ShopID

        Shop:
        ShopID;Shopname;LKZ

        ShopArtikel:
        ShopID;ArtikelID

        Artikel:
        ArtikelID;Artikelname;LKZ

        Das Löschkennzeichen (LKZ) würdest du in der Tabelle Artikel oder in der Tabelle Shop oder in beiden unterbringen und je nach dem, was du selektieren möchtest, als Kriterium verwenden.

        Viele Grüße
        Stefan

        1. Hi Stefan

          Ich hatte mir schon gedacht, dass an deinen DB-Modell etwas nicht stimmt. Es fehlen wohl zwei Tabellen: eine in der die Shops eindeutig sind und eine in der die Artikel eindeutig sind.
          Das könnte so aussehen:

          [..]

          Das Löschkennzeichen (LKZ) würdest du in der Tabelle Artikel oder in der Tabelle Shop oder in beiden unterbringen und je nach dem, was du selektieren möchtest, als Kriterium verwenden.

          Das kommt ganz darauf an was er aussagen will mit dem LKZ, wenn
          er damit aussagen will, ein Artikel ist in einem bestimmten Shop gelöscht,
          dann ist das DB-Modell völlig korrekt. Das würde zb für Verfügbarkeit
          Sinn machen und dann braucht er auch deine Detailtabellen nicht.

          Sohail: Was soll das Löschkennzeichen jetzt genau aussagen?

          Gruss Daniela