Announcement

Collapse
No announcement yet.

Verschachtelte Select

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Verschachtelte Select

    Hallo zusammen,

    eins vorweg: Ich bin noch blutiger Anfänger im SQL bereich. Leider bewahrt mich das nicht vor meiner Aufgabe, für die ich einfach keine Lösung finde. Und ich hoffe, dass mir vielleicht einer von Euch helfen kann :

    Also es geht grundsätzlich darum:

    In der Datenbank werden in die Tabelle "history" veränderungen geschrieben. Und zwar nach folgendem Schema:

    table_name
    col_name
    pk_value
    col_alt
    col_new
    datum

    Um den historischen Wert herauszubekommen, muss also folgendes Statement abgesetzt werden:

    Code:
     SELECT history.table_name,   
             history.pk_value  
        FROM history  
       WHERE ( history.table_name = 'KUNDENSTAMM' )
    So weit so einfach und gut. Jetzt möchte ich aber, dass die werte einer zweiten Tabelle "dazugemischt" werden.

    Also sprich, dass in der WHERE Klausel nicht nur die Tabelle "Kundenstamm" abgefragt wird. Sondern dass nur die Ergebnisse angezeigt werden, wo in einer weitere Tabelle "Kundenstamm_ext" die Spalte "Kunden_Art" einen bestimmten wert hat.

    Ich versuche dass mal in meinen eigenen "Code-Worten" darzustellen, der Code funktioniert so aber nicht:

    Code:
     SELECT history.table_name,   
             history.pk_value  
        FROM history  
       WHERE ( history.table_name = 'KUNDENSTAMM' ) and where (history.table_name = 'KUNDENSTAMM_ext' and 'Kunden_art='Y'  (
    Ich hoffe, ich habe mich verständlich ausgedrückt :-)

    Vielen Dank schonmal im Vorraus!!!!!

  • #2
    Hallo,
    Originally posted by Communicate View Post
    ...Sondern dass nur die Ergebnisse angezeigt werden, wo in einer weitere Tabelle "Kundenstamm_ext" die Spalte "Kunden_Art" einen bestimmten wert hat.
    In welcher Beziehung steht denn die Tabelle Kundenstamm_ext zu deiner bisherigen Abfrage?

    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


    • #3
      das feld pk_value der Tabelle history entspricht dem Feld kunden_id der Tabelle kundenstamm_ext

      Comment


      • #4
        Hallo,

        in erster Linie ist das dann doch ein einfacher JOIN.

        [highlight=sql]
        SELECT history.table_name, history.pk_value
        FROM history, Kundenstamm_ext
        WHERE Kundenstamm_ext.kunden_id = history.pk_value
        AND history.table_name = 'KUNDENSTAMM'
        and Kundenstamm_ext.Kunden_Art = 'ein_bestimmter_wert'
        [/highlight]

        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


        • #5
          Du hast vollkommen recht! Deswegen erst einmal danke!

          Aber ich hab natürlich das wichtigste verschwiegen (ist mir aber selber gerade erst aufgefallen :-) ).

          Ich möchte aus der tabelle history mehrere Werte bzw. Spalten haben.

          Also z.B. soll col_name = 'Limit' und col_name = 'Limit2' angezeigt werden.

          Ich weiss, dass hab ich anfangs gar nicht geschrieben (ist mir aber selber erst aufgefallen :-( ) ...

          Könntest Du mir nochmal helfen? Oder hab ich dich jetzt vollendes verwirrt?

          Comment


          • #6
            Originally posted by Communicate View Post
            ...Ich möchte aus der tabelle history mehrere Werte bzw. Spalten haben.

            Also z.B. soll col_name = 'Limit' und col_name = 'Limit2' angezeigt werden.
            [highlight=sql]
            SELECT history.table_name, history.pk_value, history.col_name
            FROM history, Kundenstamm_ext
            WHERE Kundenstamm_ext.kunden_id = history.pk_value
            AND history.table_name = 'KUNDENSTAMM'
            AND Kundenstamm_ext.Kunden_Art = 'ein_bestimmter_wert'
            AND history.col_name in ('Limit', 'Limit2')
            [/highlight]

            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


            • #7
              das funktioniert leider noch nicht so richtig.
              Als ergebnis erhalte ich jetzt immer nur die Werte für die Spalte "Limit".

              Das ist mein Code:

              Code:
                SELECT history.table_name,   
                       history.pk_value,   
                       history.col_name,   
                       history.col_alt,   
                       history.col_new 
                  FROM history,   
                       kundenstamm_ext  
                 WHERE (history.table_name = 'KREDITORENSTAMM' ) AND  
                       ( history.pk_value = '('||kundenstamm_ext.Kunden_ID||')' ) AND  
                       ( kundenstamm_ext.kunden_art = 'OR' ) AND  
                       (history.col_name in ( Limit','Limit2') )
              Wie gesagt, ich bekomme jetzt die Spalte Limit angezeigt, mit dem entsprechenden old- und new-Value. Aber die Spalte Limit2 wird total ignoriert.

              Was mache ich falsch? Siehst Du meinen Fehler?

              Liebe Grüße
              Dominic

              Comment


              • #8
                Originally posted by Communicate View Post
                ...Was mache ich falsch? Siehst Du meinen Fehler?
                Ausser einem fehlenden Hochkomma vor Limit bei ...history.col_name in ( Limit','Limit2'... fällt mir kein syntaktischer Fehler auf. Ob die Logik stimmt kann ich natürlich nicht beurteilen. Gibt es denn Datensätze auf die alle Bedingungen zutreffen? Welche real existierenden Daten müßten denn z.B. angezeigt werden, fehlen aber im Ergebnis?

                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


                • #9
                  schon wieder mein Fehler...

                  Die Spalte heisst nicht Limit2 sondern Limit_2 :-)

                  Funktioniert jetzt ganz prima :-)

                  Aber ich hätte da noch eine ganz andere Frage:

                  Wenn ich jetzt zu jeder Kunden_ID nur den maximal-Wert aus Limit und Limit_2 angezeigt bekommen möchte, wie kann ich die Max funktion erstellen? Habe gerade einfach mal ein max() davor gesetzt, aber das scheint nicht zu funktionieren ;-(

                  Comment


                  • #10
                    Originally posted by Communicate View Post
                    ...Aber ich hätte da noch eine ganz andere Frage:
                    Dann eigentlich am Besten auch einen ganz anderen Thread aufmachen...
                    Originally posted by Communicate View Post
                    ...Habe gerade einfach mal ein max() davor gesetzt, aber das scheint nicht zu funktionieren ;-(
                    Wenn du eine Aggregatfunktion wie MAX() verwendest musst du deine Abfrage auch gruppieren. Also wer MAX() sagt muß auch GROUP BY sagen ...
                    Ansonsten ist "scheint nicht zu funktionieren" eine sehr vielsagende Fehlerbeschreibung...

                    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


                    • #11
                      okay, dann nochmal etwas genauer :-)

                      wenn ich group by setzte, muss ich ja alles in die group by anweisung rein schreiben. ich möchte ja aber nur von den beiden spalten "limit und limit_2" die maximal werte haben (bzw. zum Datum).

                      Sprich als ergebnis soll dann rauskommen:

                      Ausgangssituation:

                      Kunde: mustermann; Datum: 01.01.2000; Limit: 10 EUR; Limit_2: 15 EUR
                      Kunde: mustermann; Datum: 01.02.2000; Limit: 8 EUR; Limit_2: 9 EUR
                      Kunde: mustermann; Datum: 01.03.2000; Limit: 4 EUR; Limit_2: 6 EUR

                      Gewünschtes Ergebnis: (höchstes Datum)

                      Mustermann; 01.03.2000; 4 EUR; 6 EUR

                      Aktuell ist mein Ergebnis, dass weiterhin alle Datensätze angezeigt werden.

                      Comment


                      • #12
                        Hallo,

                        sowas löst man am Besten mit einem Subselect:
                        [highlight=sql]
                        select Kunde, Datum, Limit, Limit_2
                        from tabelle a
                        where a.Datum = (
                        select max(b.Datum)
                        from tabelle b
                        where b.Kunde = a.Kunde
                        )
                        [/highlight]

                        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


                        • #13
                          okay,
                          klingt logisch, bei der Umsetzung tue ich mir aber etwas schwer.

                          Meine Ausgangssituation ist immer noch die gleiche Tabellensituation.
                          Was ist denn nun tabelle a und tabelle b bei mir?

                          ist tabelle a meine history tabelle? da steht ja auch das datum drin. was ist denn dann tabelle b?

                          Ich bin so verwirrt?!?!?!?!?!

                          Danke, dass Du soviel Geduld mit mir hast :-)

                          Comment


                          • #14
                            Originally posted by Communicate View Post
                            ...Aber ich hätte da noch eine ganz andere Frage:
                            Originally posted by Communicate View Post
                            ...Meine Ausgangssituation ist immer noch die gleiche Tabellensituation.
                            Ja was denn nun? Bisher gab es in deinen Abfragen kein "Datum"!
                            Vielleicht solltest du mal aufhören hier alle Nebenbedingungen Scheibchenweise von dir zu geben und konkret zu sagen was du eigentlich willst.

                            Originally posted by Communicate View Post
                            ...
                            Was ist denn nun tabelle a und tabelle b bei mir?
                            Es ist jeweils die komplette Abfrage bzw. Teile davon!
                            Also:
                            [highlight=sql]
                            SELECT history.table_name,
                            history.pk_value,
                            history.col_name,
                            history.col_alt,
                            history.col_new,
                            history.Datum
                            FROM history,
                            kundenstamm_ext
                            WHERE history.table_name = 'KREDITORENSTAMM' AND
                            history.pk_value = '('||kundenstamm_ext.Kunden_ID||')' AND
                            kundenstamm_ext.kunden_art = 'OR' AND
                            history.col_name in ( 'Limit','Limit_2') AND
                            history.Datum = (
                            select max(hist2.Datum)
                            from history hist2
                            where hist2.table_name = history.table_name
                            and hist2.pk_value = history.pk_value
                            and hist2.col_name in ( 'Limit','Limit_2') )
                            [/highlight]

                            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


                            • #15
                              sorry sorry sorry, du hast ja recht.
                              Das Problem ist, dass mir erst beim programmieren so richtig aufgefallen ist, was eigentlich noch alles fehlt und berücksichtigt werden muss. DAs nächste mal, muss ich es mir von anfang an genauer ansehen!

                              Der Code sieht jetzt ja fast perfekt aus.
                              Einziges problem bei mir ist, dass er mir (obwohl entsprechende Datensätze vorhanden) teilweise nur Limit oder Limit_2 anzeigt. Hast Du noch eine letzte Idee ?

                              Comment

                              Working...
                              X