Frage zu dem Update Befehl von SQL



  • Wenn ich Werte einer Tabelle ändern will, bei der ich eine weitere Tabelle benötige um etwas zu überprüfen, kann ich dann ein INNER JOIN Befehl in Update benutzen um die Tabellen zu verbinden?

    Beispiel - Ich habe vier Tabellen:

    Projekt(PNR, PName)
    arbeitet an(PNR->Projekt, MNR->Mitarbeiter) (Beziehungstabelle zwischen Mitarbeiter und Projekt)
    Mitarbeiter(MNR, NachName, VNR->Vertrag)
    Vertrag(VNR, Gehalt)
    

    Nun will Ich das Gehalt der Leute erhöhen die an einem bestimmten Projekt arbeiten.

    [b]UPDATE[/b] Vertag [b]INNER JOIN[/b] Mitarbeiter [b]ON[/b] Vertrag.VNR [b]=[/b] Mitarbeiter.VNR 
                  [b]INNER JOIN[/b] arbeitet an [b]ON[/b] Mitarbeiter.MNR [b]=[/b] arbeitet an.MNR 
                  [b]INNER JOIN[/b] Projekt [b]ON[/b] arbeitet an.PNR [b]=[/b] Projekt.PNR
    [b]SET[/b] Gehalt = Gehalt * 1.20
    [b]WHERE[/b] PName = "Tolles Projekt";
    

    Geht das so?

    Wenn etwas an der Frage unklar ist bitte fragen. 😃
    asd[/b]



  • Keine Ahnung ob das geht, aber ich würde es sicher nicht so schreiben.
    Eher...

    UPDATE Vertag
    SET ...
    WHERE VNR IN (
        SELECT DISTINCT VNR FROM Mitarbeiter WHERE MNR IN (
            SELECT DISTINCT MNR FROM [arbeitet an] WHERE PNR IN (
                SELECT DISTINCT PNR FROM Projekt WHERE PName = 'Tolles Projekt'
            )
        )
    );
    

    p.S.: T-SQL bietet für ähnliche Fälle die sich nicht so einfach lösen lassen die Form "UPDATE ... FROM" an. Soweit ich weiss ist das aber eben eine T-SQL spezifische Sache, und kein Standard SQL.

    p.p.S.: deine Spalten- und Tabellennamen stinken! Pfui!



  • Hallo

    Funktioniert beim M$ SQL-Server so aufjedenfall nicht, bei MySql hab ichs noch nicht so getestet.
    Mir wurde es so "gelernt":

    UPDATE vt 
    SET Gehalt = Gehalt * 1.20 
    FROM  Vertrag vt
    INNER JOIN Mitarbeiter    mt  ON vt.VNR = mt.VNR 
    INNER JOIN [arbeitet an]  at  ON mt.MNR = at.MNR 
    INNER JOIN Projekt        pt  ON at.PNR = pt.PNR 
    WHERE PName = "Tolles Projekt";
    

    Mfg Marc-o



  • Macht man mit einem SUBSELECT. Dort kannst du verwenden was du möchtest.
    Geht dann auch mit fast jedem RDBMS welches SUBSELECTS kann.



  • Unter Oracle geht es. Zumindest in der alten Schreibweise

    update tabelle a, tabelle b
    set tabelle a.feld = xxxx where a.feld = b.feld ...
    


  • hustbaer schrieb:

    Keine Ahnung ob das geht, aber ich würde es sicher nicht so schreiben.
    Eher...

    UPDATE Vertag
    SET ...
    WHERE VNR IN (
        SELECT DISTINCT VNR FROM Mitarbeiter WHERE MNR IN (
            SELECT DISTINCT MNR FROM [arbeitet an] WHERE PNR IN (
                SELECT DISTINCT PNR FROM Projekt WHERE PName = 'Tolles Projekt'
            )
        )
    );
    

    p.S.: T-SQL bietet für ähnliche Fälle die sich nicht so einfach lösen lassen die Form "UPDATE ... FROM" an. Soweit ich weiss ist das aber eben eine T-SQL spezifische Sache, und kein Standard SQL.

    p.p.S.: deine Spalten- und Tabellennamen stinken! Pfui!

    Das sieht für mich gut aus, vielen dank. 🙂
    Bin mir leider nicht sicher ob wir in UPDATE FROM benutzen dürfen, befürchte nicht.
    Anstatt der Select verschachtelung kann man aber auch INNER JOIN benutzen, oder?
    Also wie folgt:

    UPDATE Vertrag
    SET Gehalt = Gehalt * 1,05
    WHERE VNR IN (
        SELECT DISTINCT VNR
        FROM Mitarbeiter INNER JOIN arbeitet an ON Mitarbeiter.MNr = arbeitet an.MNr
                         INNER JOIN Projekt ON arbeiet an.PNr = Projekt.PNr
        WHERE PName = "tolles Projekt");
    

    Oder geht das nicht?

    PS: Warum stinken meien Tabellen und Spaltennamen? Wegen dem Leerzeichen?



  • asdfqqq schrieb:

    UPDATE Vertrag
    SET Gehalt = Gehalt * 1,05
    WHERE VNR IN (
        SELECT DISTINCT VNR
        FROM Mitarbeiter INNER JOIN arbeitet an ON Mitarbeiter.MNr = arbeitet an.MNr
                         INNER JOIN Projekt ON arbeiet an.PNr = Projekt.PNr
        WHERE PName = "tolles Projekt");
    

    Oder geht das nicht?

    Kannste so machen. Du mußt aber wirklich das Leerzeichen mit einem Auswertungsschutz versehen also "arbeitet an" im Ansi-SQL oder [arbeitet an] bei T-SQL.



  • asdfqqq schrieb:

    PS: Warum stinken meien Tabellen und Spaltennamen? Wegen dem Leerzeichen?

    Weil sie nicht aussagekräftig sind, und die Tabellennamen anscheinend keinem Schema folgen.
    "Projekt_Mitarbeiter" wäre z.B. ein wesentlich besserer Name als "arbeitet an".
    Genauso "Projekt_ID" oder "Projekt_Nr" statt "PNR" etc.


Log in to reply