Announcement

Collapse
No announcement yet.

Felder aus mehreren Tabellen abfragen

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

  • Felder aus mehreren Tabellen abfragen

    Hallo,

    ich stehe wieder vor einem Problem und hoffe, dass mir, so wie schon in der Vergangenheit, weitergeholfen wird.

    Ich habe 3 Tabellen mit Nachname, Vorname und Geburtsdatum und Bearbeitungsdatum.
    Jetzt brauche ich eine Abfrage, in der eben diese Felder in einer Zeile, wenn das Bearbeitungsdatum gleich ist, ausgegeben werden.

    Danke

    Code:
    
    create table tab_vn 
    (  Id              NUMBER(10)           not null,
       Vorname         VARCHAR2(60)         not null,
       BearbeitetAm    DATE
    );
    
    
    create table tab_nn 
    (  Id              NUMBER(10)           not null,
       Nachname        VARCHAR2(60)         not null,
       BearbeitetAm    DATE
    );
    
    
    create table tab_GD 
    (  Id            NUMBER(10)           not null,
       GebDat        DATE                 not null,
       BearbeitetAm  DATE
    );
    
    INSERT INTO tab_vn VALUES(  1, 'vorname_01', '01.01.2010' );
    INSERT INTO tab_vn VALUES(  2, 'vorname_02', '01.01.2010' );
    INSERT INTO tab_vn VALUES(  3, 'vorname_03', '02.01.2010' );
    INSERT INTO tab_vn VALUES(  4, 'vorname_04', '02.01.2010' );
    INSERT INTO tab_vn VALUES(  5, 'vorname_05', '03.01.2010' );
    INSERT INTO tab_vn VALUES(  6, 'vorname_06', '03.01.2010' );
    INSERT INTO tab_vn VALUES(  7, 'vorname_07', '04.01.2010' );
    INSERT INTO tab_vn VALUES(  8, 'vorname_08', '04.01.2010' );
    INSERT INTO tab_vn VALUES(  9, 'vorname_09', '05.01.2010' );
    INSERT INTO tab_vn VALUES( 10, 'vorname_10', '05.01.2010' );
    
    
    INSERT INTO tab_nn VALUES(  1, 'nachname_01', '01.01.2010' );
    INSERT INTO tab_nn VALUES(  2, 'nachname_02', '11.01.2010' );
    INSERT INTO tab_nn VALUES(  3, 'nachname_03', '12.01.2010' );
    INSERT INTO tab_nn VALUES(  4, 'nachname_04', '12.01.2010' );
    INSERT INTO tab_nn VALUES(  5, 'nachname_05', '03.01.2010' );
    INSERT INTO tab_nn VALUES(  6, 'nachname_06', '13.01.2010' );
    INSERT INTO tab_nn VALUES(  7, 'nachname_07', '04.01.2010' );
    INSERT INTO tab_nn VALUES(  8, 'nachname_08', '04.01.2010' );
    INSERT INTO tab_nn VALUES(  9, 'nachname_09', '15.01.2010' );
    INSERT INTO tab_nn VALUES( 10, 'nachname_10', '15.01.2010' );
    
    
    INSERT INTO tab_gd VALUES(  1, '01.01.1966', '01.01.2010' );
    INSERT INTO tab_gd VALUES(  2, '01.02.1966', '02.01.2010' );
    INSERT INTO tab_gd VALUES(  3, '01.03.1966', '03.01.2010' );
    INSERT INTO tab_gd VALUES(  4, '01.04.1966', '04.01.2010' );
    INSERT INTO tab_gd VALUES(  5, '01.05.1966', '05.01.2010' );
    INSERT INTO tab_gd VALUES(  6, '01.06.1966', '11.01.2010' );
    INSERT INTO tab_gd VALUES(  7, '01.07.1966', '15.01.2010' );
    INSERT INTO tab_gd VALUES(  8, '01.08.1966', '20.01.2010' );
    
    /* Ergebnis
    
    select nachname, vorname, gebdat, BearbeitetAm 
    
    nachname_01,vorname_01,01.01.1966,01.01.2010
    nachname_01,vorname_02,          ,01.01.2010
               ,vorname_03,01.02.1966,02.01.2010
               ,vorname_04,          ,02.01.2010
    nachname_05,vorname_05,01.03.1966,03.01.2010
    nachname_05,vorname_06,          ,03.01.2010
    nachname_07,vorname_07,          ,04.01.2010
    nachname_07,vorname_08,01.04.1966,04.01.2010
    nachname_08,vorname_07,          ,04.01.2010
    nachname_08,vorname_08,          ,04.01.2010
               ,vorname_09,          ,05.01.2010
               ,vorname_10,01.05.1966,05.01.2010
    nachname_02,          ,01.06.1966,11.01.2010
    nachname_03,          ,          ,12.01.2010
    nachname_04,          ,          ,12.01.2010
    nachname_06,          ,          ,13.01.2010
    nachname_09,          ,01.07.1966,15.01.2010
    nachname_10,          ,          ,15.01.2010
               ,          ,01.08.1966,20.01.2010      
     
    
    */
    
    

  • #2
    Versuch es mit

    select Vorname, Nachname, GebDat from tab_vn,tab_nn,tab_GD where
    tab_nn.id=tab_vn.id and
    tab_nn.id=tab_GD.id and
    tab_nn.BearbeitetAm=tab_vn.BearbeitetAm and
    tab_nn.BearbeitetAm=tab_GD.BearbeitetAm
    Christian

    Comment


    • #3
      Die Anforderung hätte ich jetzt eher so verstanden
      Code:
      select v.Vorname, v.Nachname, v.GebDat,
             n.Vorname, n.Nachname, n.GebDat,
             g.Vorname, g.Nachname, g.GebDat
        from tab_vn v, tab_nn n, tab_GD g
       where n.BearbeitetAm = v.BearbeitetAm
         and n.BearbeitetAm = g.BearbeitetAm
      Gruß, defo

      Comment


      • #4
        Naja in tab_vn git es keinen Nachnamen oder Geburtsdatum...nur den Vornamen. Ebenso in tab_nn und tab_GD
        Christian

        Comment


        • #5
          Originally posted by Christian Marquardt View Post
          Versuch es mit

          select Vorname, Nachname, GebDat from tab_vn,tab_nn,tab_GD where
          tab_nn.id=tab_vn.id and
          tab_nn.id=tab_GD.id and
          tab_nn.BearbeitetAm=tab_vn.BearbeitetAm and
          tab_nn.BearbeitetAm=tab_GD.BearbeitetAm

          Hallo Christian,

          leider nicht ganz, es kommt nur ein Satz zurück.

          VORNAME NACHNAME GEBDAT
          ------------------------------------------------------------ ------------------------------------------------------------ ---------------------------------
          vorname_01 nachname_01 01.01.1966

          Comment


          • #6
            Hallo defo,

            es gibt in jeder Tabelle nur eines der Felder, lediglich das BearbeitetAm ist in allen enthalten.

            vg

            Comment


            • #7
              Ja, den schon beim Datensatz Nr. 2 stimmte das Bearbeitungsdatum in allen 3 Tabellen nicht mehr überein.
              Insofern ist die Anforderung "wenn das Bearbeitungsdatum gleich ist" nicht mehr gegeben.

              Grundsätzlich:
              Tabellen joinen
              from tab_vn,tab_nn,tab_GD

              Die zusammengehörenden Datensätze finden, davon ausgehend, dass die Nachnamentabelle die führende ist
              tab_nn.id=tab_vn.id and
              tab_nn.id=tab_GD.id and

              Jetzt muss geklärt werden, wo das Datum gleich sein soll
              Christian

              Comment


              • #8
                Hallo Christian,

                es sollen alle Datensätze ausgegeben werden, ungeachtet dessen ob in anderen Tabellen ein solches Datum vorhanden ist. Wenn das Datum gleich ist, dann soll das in einem Satz ausgegeben werden.
                Siehe meinen 1. Beitrag ganz unten unter Ergebnis

                Danke

                Comment


                • #9
                  Sorry, dass verstehe ich nicht
                  es sollen alle Datensätze ausgegeben werden, ungeachtet dessen ob in anderen Tabellen ein solches Datum vorhanden ist.
                  select Vorname, Nachname, GebDat from tab_vn,tab_nn,tab_GD where
                  tab_nn.id=tab_vn.id and
                  tab_nn.id=tab_GD.id

                  Wenn das Datum gleich ist, dann soll das in einem Satz ausgegeben werden.
                  Welches Datum soll mit welchem gleich sein bei 3 Tabellen? Oder egal welche Tabelle -> Hauptsache eins ist gleich?
                  Welches ist die führende Tabelle?
                  Christian

                  Comment


                  • #10
                    Jede Tabelle hat 10 Datensätze. Wenn kein Bearbeitungsdatum gleich sein würde, soll die Abfrage alle 30 Datensätze ausgeben. Sobald in 2 oder 3 der Tabellen das Bearbeitsungsdatum gleich ist, soll dafür nur ein Datensatz ausgegeben werden:
                    Code:
                    nachname_01,vorname_01,01.01.1966,01.01.2010
                    nachname_01,vorname_02,          ,01.01.2010
                    
                               ,vorname_03,01.02.1966,02.01.2010
                               ,vorname_04,          ,02.01.2010
                    
                    nachname_05,vorname_05,01.03.1966,03.01.2010

                    Comment


                    • #11
                      Nee, das kann so nicht sein
                      a) die Tabellen Geburtsdatum hat nur 8 Datensätze
                      b) sollte es ja so aufgebaut sein, dass zu jedem Nachname es einen Vornamen und ein Geburtsdatum gibt.


                      nachname_01,vorname_01,01.01.1966,01.01.2010
                      nachname_01,vorname_02, ,01.01.2010
                      Wie kommst du hierzu, den Nachnamen 01 mit dem Vornamen 02 zu verknüpfen?
                      Bloß weil sie ein gemeinsames Änderungsdatum haben?

                      Irgendwie verstehe ich das Datenmodell nicht.
                      Aber vielleicht Defo.....
                      Christian

                      Comment


                      • #12
                        Hallo Christian,

                        jeder Datensatz in den 3 Tabellen kann, aber muss nicht, mit einem anderen Datensatz verknüpft sein. Eine Tabelle enthält nur Vornamen, die andere Nachnamen und die dritte nur Geburtsdaten. Eines gemeinsam haben alle, das Bearbeitungsdatum. Es kann gleich sein, aber muss nicht gleich sein.
                        In meinem Beispiel gibt es mit dem '01.01.2010' in der Tabelle "Nachnamen" den Eintrag "nachname_01" und in der Tabelle "Vornamen" die Einträge "vorname_01" und vorname_02" und in Tabelle "Geburtsdatum" den Eintrag "01.01.1966". Eines gemeinsam, alle haben da das gleiche "Bearbeitungsdatum".
                        Daher soll das oben genannte Ergebnis herauskommen (Ein Fehler ist mir gerade aufgefallen, natürlich müsste das Geburtsdatum in beiden des oberen Beispiel vorkommen). Gibt es kein gemeinsames "Bearbeitungsdatum", oder nur in einer der Tabellen, so soll der ausgegeben werden.

                        nachname_01,vorname_01,01.01.1966,01.01.2010
                        nachname_01,vorname_02,01.01.196,01.01.2010

                        Danke

                        PS.: Ich freue mich auf eine Antwort, kann diese aber erst am Montag bearbeiten. Bitte um Verständnis!

                        Comment


                        • #13
                          Waren die Createstatements und Inserts schon von Anfang an da? Dann werde ich wohl alt.

                          Hab die Diskussion nicht komplett durchgelesen, das einzige was mir einfällt wären full outer joins. Gibt es ja sogar in Oracle seit einiger Zeit.
                          Code:
                          select n.*, v.*, g.*,
                                 nvl(n.bearbeitetam, nvl(v.bearbeitetam, g.bearbeitetam)) AnyOfGivenDate
                            from            tab_vn v
                            full outer join tab_nn n
                              on v.bearbeitetam = n.bearbeitetam
                            full outer join tab_gd g
                              on n.bearbeitetam = g.bearbeitetam
                           order by 10, 2, 4, 6
                          Ergebnis
                          Code:
                          ID  NACHNAME     BEARBEITETAM  ID  VORNAME     BEARBEITETAM ID  GEBDAT      BEARBEITETAM  ANYDATE
                           1  nachname_01  01.01.2010     1  vorname_01  01.01.2010    1  01.01.1966  01.01.2010    01.01.2010
                           1  nachname_01  01.01.2010     2  vorname_02  01.01.2010    1  01.01.1966  01.01.2010    01.01.2010
                                                          3  vorname_03  02.01.2010                                 02.01.2010
                                                          4  vorname_04  02.01.2010                                 02.01.2010
                                                                                       2  01.02.1966  02.01.2010    02.01.2010
                           5  nachname_05  03.01.2010     5  vorname_05  03.01.2010    3  01.03.1966  03.01.2010    03.01.2010
                           5  nachname_05  03.01.2010     6  vorname_06  03.01.2010    3  01.03.1966  03.01.2010    03.01.2010
                           7  nachname_07  04.01.2010     7  vorname_07  04.01.2010    4  01.04.1966  04.01.2010    04.01.2010
                           7  nachname_07  04.01.2010     8  vorname_08  04.01.2010    4  01.04.1966  04.01.2010    04.01.2010
                           8  nachname_08  04.01.2010     7  vorname_07  04.01.2010    4  01.04.1966  04.01.2010    04.01.2010
                           8  nachname_08  04.01.2010     8  vorname_08  04.01.2010    4  01.04.1966  04.01.2010    04.01.2010
                                                          9  vorname_09  05.01.2010                                 05.01.2010
                                                         10  vorname_10  05.01.2010                                 05.01.2010
                                                                                       5  01.05.1966  05.01.2010    05.01.2010
                           2  nachname_02  11.01.2010                                  6  01.06.1966  11.01.2010    11.01.2010
                           3  nachname_03  12.01.2010                                                               12.01.2010
                           4  nachname_04  12.01.2010                                                               12.01.2010
                           6  nachname_06  13.01.2010                                                               13.01.2010
                           9  nachname_09  15.01.2010                                  7  01.07.1966  15.01.2010    15.01.2010
                          Zuletzt editiert von defo; 08.09.2017, 07:44.
                          Gruß, defo

                          Comment


                          • #14
                            Originally posted by Christian Marquardt View Post
                            Irgendwie verstehe ich das Datenmodell nicht.
                            Ich verstehe es auch nicht, ich erkläre es mir so ungefähr:
                            Datenmodell würde ich es nicht nennen. Ein Datenmodell ist ja irgendwas geplantes, entworfenes. Das hier sieht mehr nach Daten reparieren aus oder vielleicht Analyse von irgendwelchen Statistikdaten/Importen.
                            Oder es ist ein "abstraktes" Beispiel, in dem es nur um die Anwendung einer Technik geht.
                            Gruß, defo

                            Comment


                            • #15
                              Genau Defo,

                              da wurden im Laufe der Zeit nur wahllos Daten gesammelt, die ich jetzt in eine Struktur bringen soll.

                              Ja, die "Createstatements" waren von Anfang an da. Ich weiß ja wie ich mich zu benehmen habe ;-)

                              Auf jeden Fall habe ich wieder etwas neues bei dir gelernt - "Full Outer Join", was immer das auch ist, Google wird es mir verraten.

                              Danke für eure Hilfe, insbesondere dir Defo :-)

                              vg
                              Urwi

                              Comment

                              Working...
                              X