Announcement

Collapse
No announcement yet.

Einträge aus einer alten Tabelle in eine neue übernehmen (ohne Doppelte + ID)

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

  • Einträge aus einer alten Tabelle in eine neue übernehmen (ohne Doppelte + ID)

    Hallo,

    Ich muss in einem Statement aus einer alten Tabelle Daten in eine neue übernehmen. In der alten Tabelle kommen gebaeude und standort öfter vor und müssen daher gruppiert werden, damit ich keine doppelten Einträge bekomme. Allerdings muss ich beim übertragen in die neue Tabelle diesem gebaeude auch eine ID vergeben (Sequence S_GEBAEUDE existiert bereits).

    Folgendes Statement würde mir die Einträge liefern die ich brauche (aber ohne ID):
    Code:
    insert into GEBAEUDE (gebaeude, standort )
    select gebaeude, standort from einrichtungen where gebaeude NOT LIKE '' and standort NOT LIKE ''  GROUP  BY gebaeude, standort
    Folgendes Statement liefert mit das ganze mit ID, jetzt aber mit doppelten Einträgen:
    Code:
    insert into GEBAEUDE (id, gebaeude, standort )
    select s_GEBAEUDE.nextval, gebaeude, standort from einrichtungen where gebaeude NOT LIKE '' and standort NOT LIKE ''  GROUP  BY gebaeude, standort
    Ich brauche also etwas dazwischen. Ein Statement, dass mir die ID's einträgt aber keine doppelten Einträge mitliefert. Hat jemand eine Idee?

    Vielen Dank im Voraus.

    Grüße,
    Lorelin

  • #2
    Im ersten Code nicht GROUP BY verwenden, sondern DISTINCT. Das klappt allerdings nur dann, wenn weitere Spalten, die übertragen werden sollen, ebenfalls faktisch eindeutig sind. Jürgen

    Comment


    • #3
      Das bringt mir aber eine Fehlermeldung:

      insert into GEBAEUDE(id, gebaeude, standort )
      select s_GEBAEUDE.nextval, DISTINCT( gebaeude, standort ) from einrichtungen where gebaeude NOT LIKE '' and standort NOT LIKE ''

      Wie muss ich das Distinct hier verwenden? Oder geht es auch anders?

      Anmerkung: ein gebäude kann kan mehreren Standorten vorkommen und ist somit nicht eindeutig

      Comment


      • #4
        Originally posted by Lorelin View Post
        Das bringt mir aber eine Fehlermeldung:
        Und wir sollen raten, wie die Fehlermeldung lautet?

        insert into GEBAEUDE(id, gebaeude, standort )
        select s_GEBAEUDE.nextval, DISTINCT( gebaeude, standort ) from einrichtungen where gebaeude NOT LIKE '' and standort NOT LIKE ''
        Wozu wird eigentlich immer darauf hingewiesen, dass Quellcode im Beitrag zu markieren ist? In deinem ersten Beitrag hast du es beachtet.

        Wie muss ich das Distinct hier verwenden? Oder geht es auch anders?
        Dein Fehler liegt in der falschen Verwendung von DISTINCT. Das bezieht sich auf den gesamten Datensatz und muss zwischen SELECT und der Spaltenliste stehen. Dabei gehört die nächste ID auch zur Spaltenliste; also muss der Befehl so lauten:
        Code:
        insert into GEBAEUDE(id, gebaeude, standort )
        select DISTINCT s_GEBAEUDE.nextval, gebaeude, standort from einrichtungen where gebaeude NOT LIKE '' and standort NOT LIKE ''
        Anmerkung: ein gebäude kann kan mehreren Standorten vorkommen und ist somit nicht eindeutig
        DISTINCT muss eindeutig sein in Bezug auf die vollständige Spalte, d.h. die Kombination s_GEBAEUDE.nextval, gebaeude, standort muss eindeutig sein. Das ist offensichtlich gewährleistet; also bringt das kein Problem.

        Du solltest dir ein geeignetes Nachschlagewerk suchen, z.B. die Oracle-Dokumentation. Allerdings sind die Erklärungen mit ihren Diagrammen sehr gewöhnungsbedürftig; es dauert teilweise auch, bis man z.B. mit Queries und Subqueries das richtige Kapitel gefunden hat. Da sollte die Einführung in SQL besser geeignet sein; allerdings kann sie die Oracle-Besonderheiten nur teilweise berücksichtigen. Jürgen

        Comment


        • #5
          Die generierte ID durch nextval ist doch immer eindeutig. Dadurch entsteht das Problem der doppelten Einträge ja erst. Mit

          Code:
           select DISTINCT S_GEBAEUDE.nextval, gebaeude, standort from einrichtung where gebaeude NOT LIKE '' and standort NOT LIKE ''
          bekomme ich 258 Datensätze. Beispielweise:


          ID - GEBÄUDE - STANDORT
          1101 - B - HH
          1102 - B - HH
          1105 - B - HH
          1112 - B - HH
          1113 - B - HH
          1115 - B - HH

          Es gibt aber nur 30 Gebäude (da in jedem Gebäude aber mehrere Einrichtungen vorhanden sind stehen sie natürlich öfter in der Tabelle. Die korrekt Anzahl Gebäude bekomme ich mit:

          Code:
          select gebaeude, standort from einrichtungen where gebaeude NOT LIKE '' and standort NOT LIKE ''  GROUP  BY gebaeude, standort
          In der Dokumentation habe ich bereits nachgeschaut, aber da finde ich nichts was mir bei diesem Problem konkret hilft. Eigentlich müsste ich das Distinct auf die Kombination standort_gebäude beziehen.

          Also mehr so:

          Code:
          select Distinct(Concat(gebaeude, standort)) from sonst_einricht where gebaeude NOT LIKE '' and standort NOT LIKE ''
          Was auch als Standalone funktioniert, aber versuche ich es dann so zu benutzen:

          Code:
          insert into GEBAEUDE(id, gebaeude, standort )
          select S_GEBAEUDE.nextval, Distinct(Concat(gebaeude, standort)) from einrichtung where gebaeude NOT LIKE '' and standort NOT LIKE ''
          kommt folgender Fehler:

          Syntax error or access violation;-5015 POS(31) Missing keyword:YEARS,YEAR,WEEKOFYEAR,WEEK,VSIZE,VARIANCE, VARCHAR2,VA
          select S_GEBAEUDE.nextval, Distinct(Concat(gebaeude, standort)) from einrichtung where gebaeude NOT LIKE '' and standort NOT LIKE '

          Comment


          • #6
            Originally posted by Lorelin View Post
            Die generierte ID durch nextval ist doch immer eindeutig. Dadurch entsteht das Problem der doppelten Einträge ja erst.
            Stimmt, da hatte ich eine falsche Schlussfolgerung.

            Ich glaube, das einfachste dürfte dann eine Unterabfrage sein:
            Code:
            insert into GEBAEUDE(id, gebaeude, standort )
            select S_GEBAEUDE.nextval, gebaeude, standort
              from (select Distinct gebaeude, standort from einrichtung where gebaeude NOT LIKE '' and standort NOT LIKE '')
            Ich nehme an, dass es noch einen einfacheren Weg gibt; aber mir fällt nicht immer der beste Weg ein.

            Was auch als Standalone funktioniert, aber versuche ich es dann so zu benutzen: ... kommt folgender Fehler:
            SQL ist relativ einfach zu steuern; aber damit das DBMS einen Befehl verarbeiten kann, muss der Befehl genau nach den Regeln geschrieben werden. Nach DISTINCT müssen Trennzeichen (Leerzeichen, neue Zeile o.ä.) und eine Liste von Spalten folgen. Eine Klammer gehört zu anderen Elementen; also moniert Oracle "Missing keyword".

            Deshalb empfehle ich dringend, die Befehlsstruktur zu lernen und zu beachten. Jürgen

            Comment


            • #7
              Originally posted by Lorelin View Post
              Es gibt aber nur 30 Gebäude (da in jedem Gebäude aber mehrere Einrichtungen vorhanden sind stehen sie natürlich öfter in der Tabelle. Die korrekt Anzahl Gebäude bekomme ich mit:

              Code:
              select gebaeude, standort from einrichtungen where gebaeude NOT LIKE '' and standort NOT LIKE ''  GROUP  BY gebaeude, standort
              Distinct hat eigentlich keine andere Funktion als ein Group by. Es ist nur kompakter und nicht so mächtig. Das Selectergebnis, das ohne Distinct mglw. mehrfache Einträge erhält, wird mit Dinstinct-Angabe auf eindeutige Datensätze reduziert.

              Wenn das oben zitierte Statement Dein Wunschergebnis ist, bist Du doch eigentlich fertig.
              Zum Verständnis und zur Deutlichkeit vielleicht noch eine Select drumlegen, das die ID liefert:

              Code:
              INSERT INTO gebaeude
                          (id,
                           gebaeude,
                           standort)
              SELECT s_gebaeude.nextval,
                     x.*
              FROM   (SELECT gebaeude,
                             standort
                      FROM   einrichtungen
                      WHERE  gebaeude NOT LIKE ''
                             AND standort NOT LIKE ''
                      GROUP  BY gebaeude,
                                standort) x
              Das Like in Deinen Anweisungen dient eigentlich der Wildcardsuche, enthält aber keine entsprechenden Muster.
              Ein
              Code:
              is not Null and feld !=''
              sollte es besser treffen und ist im Zweifel schneller. Spielt bei 30 Datensätzen aber vermutlich keine Rolle.
              Gruß, defo

              Comment


              • #8
                Danke ich werde es so versuchen.

                Comment


                • #9
                  Welchen Zweck soll den eigentlich dieser Filter haben?
                  Code:
                  WHERE  gebaeude NOT LIKE ''
                                 AND standort NOT LIKE ''
                  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


                  • #10
                    Es gibt Einrichtungen die keinem standort oder keinem gebäude zugeordnet sind. Dabei handelt es sich um sehr alte Einträge als diese Zuordnung noch keien Rolle spielte. Aber wie üblich hat keiner Zeit sich diesen Datensätzen anzunehmen und das zu verbessern .... naja. Damit muss man dann halt leben...

                    Comment


                    • #11
                      Hi,

                      das wird aber nicht richtig funktionieren. Ein Leerstring '' ist in Oracle gleichbedeutend mit NULL.
                      NULL ist aber immer ungleich NULL d.h. die Bedingung wird nie erfüllt.

                      Um auf NULL zu prüfen, musst Du WHERE spalte IS NULL bzw. IS NOT NULL verwenden.

                      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

                      Working...
                      X