Announcement

Collapse
No announcement yet.

Update über 3 Tabellen

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

  • Update über 3 Tabellen

    Hi. ich hab mal eine kurze Frage..
    Ich will ein Update üebr 3 Tabellen machen.. mit 2 geht das Problemlos.. bei 3 kommt ein Fehler..

    Könnt Ihr mir sagen wo da der unterschied zwischen 2 und 3 Tabellen ist?

    Code:
    UPDATE
    (SELECT o.KEY, o.TYPE
    FROM o
    INNER JOIN m ON o.ID=m.ID
    INNER JOIN s ON o.ID=s.ID
    WHERE o.TYPE='60' and o.key = '132456') neu
    SET neu.type = '60'
    "Kann keine Spalte die einer Basistabelle zugeordnet wird verändern"

    Code:
    UPDATE
    (SELECT o.KEY, o.TYPE
    FROM o
    INNER JOIN m ON o.ID=m.ID
    WHERE o.TYPE='60' and o.key = '132456') neu
    SET neu.type = '60'
    So.. also mit einem JOIN funktioniert das allerdings wunderbar..

    Warum ist das so?

    Vielen Dank

  • #2
    Auch wenn Dir das nicht weiterhilft:
    Die Fehlermeldung sagt, Oracle kann anhand der selektierten Daten und der (im Repository verfügbaren Primary Key Infos) nicht automatisch bestimmen, welche Primärschlüssel verwendet, und demzufolge, welche Datensätze aktualisiert werden sollen.
    Das hat nichts mit der Anzahl der Tabellen zu tun.

    Da anhand Deines Statements auch dem Forenleser unklar bleibt, welche Schlüsselinformationen verwendet werden könnten, kann man auch weiter wenig dazu sagen.
    Gruß, defo

    Comment


    • #3
      Ahhh ok.. hmmm.. dann mach ich mich damit mal auf die Suche..
      Danke das hat mir schon geholfen.. ggf melde ich mich nochmal..

      Edit:// Also die ID ist in jeder Tabelle Primärschlüssel..
      Wie kann ich da denn vorgehen damit das funktioniert? Bzw welche Infos braucht ihr noch um mir weiterhelfen zu können?
      Zuletzt editiert von ZeroIce; 16.11.2012, 12:52.

      Comment


      • #4
        Du könntest schon mal die ID der Basistabelle mit in Dein Selectstatement integrieren, sofern es tatsächlich die PK Spalte ist.
        Ansonsten ist das Statement, was Du da verwendest recht ungewöhnlich- zumindest für mich.
        Gruß, defo

        Comment


        • #5
          Ich bin für bessere Vorschläge offen.. hab halt gesucht wie ich mit Oracle viele Tabellen gleichzeitig update.. und das hat mit 2 funktioniert..

          Comment


          • #6
            Originally posted by ZeroIce View Post
            Ich bin für bessere Vorschläge offen.. hab halt gesucht wie ich mit Oracle viele Tabellen gleichzeitig update.. und das hat mit 2 funktioniert..
            Das würde ich bezweifeln. Du hast eine Tabelle aktualisiert, lediglich mehrere dabei benutzt.
            Was passiert denn, wenn Du die ID mit ins select rein schreibst?
            Gruß, defo

            Comment


            • #7
              Alternativ kann in solchen Fällen MERGE verwendet werden.

              Comment


              • #8
                Originally posted by jum View Post
                Alternativ kann in solchen Fällen MERGE verwendet werden.
                Also abgesehen von der ungewöhnlichen Syntax ist das m.E. ein normales Update, also braucht man kein Merge.
                Gruß, defo

                Comment


                • #9
                  Hi.. vielen Dank für die Antowrten..

                  @defo
                  Ich habe die IDs alle mal mit reingenommen.. gleiches Ergebnis..
                  Auch mit SELECT * gleiches Ergebnis..

                  Welche Schreibweise würdest du denn für das Update verwenden wenn du 3 Tabellen updaten willst?

                  Danke schon mal für die Antworten..

                  Comment


                  • #10
                    Haben die Tabellen M und S auch beide einen Primary Key definiert? Sicher?

                    Was immer gehen sollte ist
                    Code:
                    update myTabel U
                        set U.myField = 'myValue'
                    where [all myConditions on U]
                       and U.ID in (any SQL returning matching IDs)
                    Gruß, defo

                    Comment


                    • #11
                      Die haben alle Primärschlüssel... bzw sogar mehrere..

                      Bei deinem Beispiel ist das aber nur eine Tabelle oder? Muss ja 3 updaten..

                      Comment


                      • #12
                        Also in EINEM Update-Statement kann nur EINE Tabelle aktualisiert werden, egal wie direkt UPDATE/MERGE oder "versteckt" INSTEAD OF TRIGGER.

                        PS:
                        Meist stellt sich in diesem Zusammenhang die Frage nach der Normalisierung, d.h. warum sind die Daten "mehrfach" gespeichert.

                        Comment


                        • #13
                          DAS hab ich mich auch schon gefragt.. aber da kann ich nix dran ändern..

                          Comment


                          • #14
                            Originally posted by ZeroIce View Post
                            Die haben alle Primärschlüssel... bzw sogar mehrere..

                            Bei deinem Beispiel ist das aber nur eine Tabelle oder? Muss ja 3 updaten..
                            Auch in Deinem Eingangsbeispiel machst Du nur ein Update auf eine Tabelle! Ich hatte das schon angesprochen, es spielt keine Rolle, wieviel Tabellen an dem Updatestatement beteiligt sind, solange nur die Felder einer Tabelle geändert werden. Das ist in Deinen Beispielen jeweils auch genau so!

                            Also was willst Du? Ist Dein Beispiel schlecht gewählt oder Deine Überschrift?

                            Denormalisierte Daten ändert man am besten über stored procedures, die haargenau das erledigen, was anhand des Datenmodells notwendig ist. Also Schritt für Schritt in einer Transaktion alle Tabellen ändern. Diese Prozeduren werden dann anstelle von Insert/Update/Delete verwendet und damit nichts schiefgeht, werden die Rechte für Insert/Update/Delete direkt auf der Tabelle entzogen.
                            (Ich schreib das nur, weil Du daran angeblich nichts ändern kannst. Normalerweise sollte es gar nicht soweit kommen)

                            PS: Was meinst Du eigentlich mit mehrere PK?! Ich rede nicht von Indices und auch nicht von FK oder so. Und auch nicht von PK Feldern..
                            Zuletzt editiert von defo; 19.11.2012, 18:11.
                            Gruß, defo

                            Comment

                            Working...
                            X