Information ausblenden
Willkommen im Forum für alle Datenbanken! Registriere Dich kostenlos und diskutiere über DBs wie Mysql, MariaDB, Oracle, Sql-Server, Postgres, Access uvm

Spalte eine Tabelle updaten

Dieses Thema im Forum "Microsoft Access" wurde erstellt von Heidestrand, 10 April 2015.

  1. Heidestrand

    Heidestrand Benutzer

    Hallo Leute,

    ich habe nur eine kleine Sache und hoffe, dass ihr mir helfen könnt, diese schnell zu lösen.
    Ich habe zwei Tabellen: tblNewOrder und tblTEST.
    In tblTEST habe ich zwei Spalten "Verkaufsbeleg" und "Beschreibung".
    In tblNewOrder mache ich 5 Spalten, eine davon heißt auch "Verkaufsbeleg" und eine andere "System". Letztere ist leer.
    Nun möchte ich gerne per SQL, dass er mir die Spalte "System" dort mit Werten aus der Spalte "Beschreibung" füllt, wo in beiden Tabellen der Verkaufsbeleg identisch ist.

    Bis jetzt habe ich diesen Code:
    Code:
    UPDATE tblNewOrder
    SET tblNewOrder.System = (SELECT Verkaufsbeleg
                   FROM tblTEST
                   LEFT JOIN tblTEST.Verkaufsbeleg ON tblNewOrder.Verkaufsbeleg)
    WHERE tblTEST.Verkaufsbeleg = tblNewOrder.Verkaufsbeleg;
    
    .

    Nur wirft er mir die Fehlermeldung Syntaxfehler raus.

    Wisst ihr, was an meinem Code falsch ist?

    Danke im Voraus!
     
  2. Distrilec

    Distrilec Datenbank-Guru

    Deine Join-Clause ist falsch.
    Soetwas gibt es nicht:
    Code:
    LEFT JOIN tblTEST.Verkaufsbeleg ON tblNewOrder.Verkaufsbeleg
    Dazu kommt dann noch ein "ambiguously defined column", da es die Spalte "verkaufsbeleg" in beiden tabellen gibt und du keinen Alias verwendest.
    Deine Where-Clause außerhalb des Sub-Selects ist übrigens auch unnötig... Und müsste in der Theorie auch einen Fehler werfen.

    Du suchst warhscheinlich soetwas:
    Code:
    Update tblneworder tn
    Set    tn.system =
           (Select tn.beschreibung
            From   tbltest tt
            Left   Join tblneworder tne
            On     tn.verkaufsbeleg = tt.verkaufsbeleg
             And tne.vekaufsbeleg = tt.verkaufsbeleg);
    
    Wobei man das ganze auch noch etwas reduzieren könnte:
    Code:
    Update tblneworder tn
    Set    tn.system =
           (Select tn.beschreibung
            From   tbltest tt
            Where  tt.verkaufsbeleg = tn.verkaufsbeleg);
    
    Wenn du dieses Update mehrfach ausführst möchtest du aber wahrscheinlich auch nur die updaten, die wirklich leer sind... Performance und so :)
    Code:
    Update tblneworder tn
    Set    tn.system =
           (Select tn.beschreibung
            From   tbltest tt
            Where  tt.verkaufsbeleg = tn.verkaufsbeleg)
    Where tn.system Is Null;
    
     
    Zuletzt bearbeitet: 10 April 2015
  3. Heidestrand

    Heidestrand Benutzer

    Danke für die Nachricht, Distrilec. Ich habe mir jetzt mal deinen letzten Code geschnappt, aber beim Ausführen fragt er mich nach einem Parameter
    und sagt mir, dass die Operation eine aktualisierbare Abfrage verwenden muss. Das sollte ja eigentlich nicht sein, dass es mich nach etwas fragt ;)
     
    Zuletzt bearbeitet: 10 April 2015
  4. Distrilec

    Distrilec Datenbank-Guru

    Wo fragt er dich nach einem Parameter... da ist nämlich definitiv keiner drinn :)
     
  5. Heidestrand

    Heidestrand Benutzer

    Naja, schau. Wenn ich deinen Code so ausführe, kommt das:

    21548112nk.png


    Edit:

    ich habs kurz umgebastelt:
    Code:
    UPDATE tblNewOrder
    SET tblNewOrder.System =
           (SELECT tblTEST.Beschreibung
            From   tblTEST
            Where  tblTEST.Verkaufsbeleg = tblNewOrder.Verkaufsbeleg)
    Where tblNewOrder.System Is Null;
    
    Jetzt ist zwar die Abfrage weg, aber der Fehler kommt noch..
     
  6. ukulele

    ukulele Datenbank-Guru

    Probier mal:
    Code:
    UPDATE    t1
    SET        t1.[System] = t2.Beschreibung
    FROM    tblNewOrder t1
    INNER JOIN tblTEST t2
    ON        t2.Verkaufsbeleg = t1.Verkaufsbeleg
    WHERE    t1.[System] IS NULL
     
  7. Distrilec

    Distrilec Datenbank-Guru

    Sry.... Aus tn.beschreibung sollte ein tt.beschreibung werden.... Was ein Buchstabe in einem Alias doch für Auswirkungen haben kann ...:D

    Edit:
    Nocheinmal angepasst
    Code:
    Update tblneworder tn
    Set    tn.system =
           (Select tt.beschreibung
            From   tbltest tt
            Where  tt.verkaufsbeleg = tn.verkaufsbeleg)
    Where tn.system Is Null;
     
  8. Heidestrand

    Heidestrand Benutzer

    Danke für eure Antworten!

    @ukulele:
    Wenn ich deinen Code verwende, gibt er mir diesen Fehler:
    21589909tp.png
    Ich weiß leider nicht, was da fehlt..

    @Distrilec
    Auch danke an dich für deinen Code, jedoch kommt auch hier immer noch die Meldung, dass die Operation eine aktualisierbare Abfrage verwenden muss.
    Ich habe das mal gegoogelt und auch eine Lösung gefunden: "Öffnen Sie die Abfrage-Eigenschaften und stellen die Option «Eindeutige Datensätze» auf «Ja». Anschließend wird die Abfrage problemlos laufen, es sei denn es besteht immer noch eine 1:n-Referenz, d.h. in der verbundenen Abfrage sind nicht alle Bezüge eindeutig".
    Die Option finde ich bei mir nicht..
     
  9. Distrilec

    Distrilec Datenbank-Guru

    Welche Primary Keys hat deine Tabelle tbltest ? Scheint mir so als würde der Verkaufsbeleg nicht reichen... Musst du uns natürlich sagen :)
     
  10. Heidestrand

    Heidestrand Benutzer

    Ok, tut mir leid :D Also eigentlich hat die tblTEST keinen PK, sie wird dynamisch erzeugt und soll danach wieder gelöscht werden. Eine andere Query erstellt tblTEST nämlich.
    tblTEST sieht so aus:
    [​IMG]
    Die tblNewOrder hat auch noch keinen PK, den kann ich aber einfügen mit Code.
     
  11. Distrilec

    Distrilec Datenbank-Guru

    Dann hast du falsche Daten....
    Code:
    Select verkaufsbeleg, count(*)
    From tblTest
    Group By verkaufsbeleg
    Order By count(*) desc
    Ausführen... Und gucken wo überall der Count Wert != 1 ist :)
     
  12. Heidestrand

    Heidestrand Benutzer

    Ich merke gerade, in der tblTEST kommen teilweise die Verkaufsbelege mehrfach vor. Das ist natürlich nicht gut.
    Bezogen auf deinen Code kommen nur 55% der Ergebnisse auf =1, der Rest ist !=1.
     
  13. Distrilec

    Distrilec Datenbank-Guru

    Genau... Dementsprechend gibt es in meinem Subselect auch mehrere Rückgabewerte... Und ich kann in ein Feld nicht 2+ Werte eintragen... Das funktioniert nicht ;)
     
Die Seite wird geladen...

Diese Seite empfehlen

  1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies.
    Information ausblenden