Query gesucht: Query gesucht

Hi,

ich habe ein Updateszenario, das ich sehr umständlich programmiert habe. Es tut seine Dienst, aber ich frage mich, ob das nicht auch in einer einzigen Query geht.

Szenario:
---------------------------
Tabelle L:
L-ID, Art
---------------------------
Tabelle LT:
LT-ID, L-ID, P-ID
---------------------------
Tabelle LM:
LM-ID, L-ID, LT-ID, Anzahl
---------------------------

Ich möchte, falls Eintrag in Tabelle LM vorhanden, in der Tabelle LM die Anzahl eines Postens LT.P-ID="ABC" updaten. Aber nur dann, wenn der zugehörige Eintrag in der Tabelle L die Art "XY" hat.

Ist das so verständlich erklärt oder noch nicht?

Grüße, Frank

  1. Ich möchte, falls Eintrag in Tabelle LM vorhanden, in der Tabelle LM die Anzahl eines Postens LT.P-ID="ABC" updaten.

    In LM willst du LT.P-ID, also ein Feld aus der Tabelle LT updaten?

    Generell machst du da erst mal eine Abfrage wie bei einem SELECT.
    Dann
    UPDATE LM SET ...
      FROM LM INNER JOIN L ON ...
      WHERE L.Art = "XY"

    1. Ich möchte, falls Eintrag in Tabelle LM vorhanden, in der Tabelle LM die Anzahl eines Postens LT.P-ID="ABC" updaten.
      In LM willst du LT.P-ID, also ein Feld aus der Tabelle LT updaten?

      Sowohl ein Feld aus LT, wie auch aus LM. Die sind ja quasi über die LT-ID in Relation.

      Generell machst du da erst mal eine Abfrage wie bei einem SELECT.
      Dann
      UPDATE LM SET ...
        FROM LM INNER JOIN L ON ...
        WHERE L.Art = "XY"

      Kann ich da wirklich einen ganz normalen JOIN oder LEFT JOIN als SELECT machen und dann das SELECT gegen ein UPDATE austauschen?

      Frank

      1. Sowohl ein Feld aus LT, wie auch aus LM. Die sind ja quasi über die LT-ID in Relation.

        Die P-ID ist laut deinem Beispiel nur in der Tabelle LT.
        Das ist aber für mich nicht schlüssig erklärt. Überleg dir mal genau was wie passieren soll.

        Kann ich da wirklich einen ganz normalen JOIN oder LEFT JOIN als SELECT machen und dann das SELECT gegen ein UPDATE austauschen?

        Ich weiß nicht ob man mehrere Tabellen in einem Statement updaten kann. Sollte sich aber rausfinden lassen.

  2. Tach!

    ich habe ein Updateszenario, das ich sehr umständlich programmiert habe.

    Auch die Tabellenstruktur scheint mit suboptimal, zumindest in einem Punkt

    Szenario:

    Tabelle L:
    L-ID, Art

    Tabelle LT:
    LT-ID, L-ID, P-ID

    Tabelle LM:
    LM-ID, L-ID, LT-ID, Anzahl

    Du hast da quasi ein Dreieck drin. Sowohl LT als auch LM haben einen Verweis auf L, aber LM hat auch einen Verweis auf LT. Somit ist bereits LM über LT mit L verbunden und braucht keinen direkten Verweis auf L. Du bekommst Inkonsistenzen in deinen Datenbestand, wenn du LT.L_ID änderst und LM.L_ID nachzuziehen vergisst. Wenn du LM.L_ID streichst, kann dir das nicht mehr passieren. - Oder zeigen etwa miteinander verbundene LT und LM auf unterschiedliche L?

    Ich möchte, falls Eintrag in Tabelle LM vorhanden, in der Tabelle LM die Anzahl eines Postens LT.P-ID="ABC" updaten. Aber nur dann, wenn der zugehörige Eintrag in der Tabelle L die Art "XY" hat.

    MySQLs UPDATE kennt eine Multi-Table-Variante. Die kann einerseits Daten in mehreren Tabellen ändern, andererseits können die Joins auch nur zum Finden der richtigen Daten in einer Tabelle herangezogen werden.

    dedlfix.

    1. Hi,

      Auch die Tabellenstruktur scheint mit suboptimal, zumindest in einem Punkt

      Ja, weiß ich.
      Die Spalte L-ID in der Tabelle LM führe ich redundant mit. Eigentlich nur zum entwickeln, sie wäre unnötig, weil die Relation ja bereits über die LT-ID Spalte gegeben ist.

      Szenario:

      Tabelle L:
      L-ID, Art

      Tabelle LT:
      LT-ID, L-ID, P-ID

      Tabelle LM:
      LM-ID, L-ID, LT-ID, Anzahl

      Du hast da quasi ein Dreieck drin. Sowohl LT als auch LM haben einen Verweis auf L, aber LM hat auch einen Verweis auf LT. Somit ist bereits LM über LT mit L verbunden und braucht keinen direkten Verweis auf L.

      Ja. Genau das meinte ich oben.

      Oder zeigen etwa miteinander verbundene LT und LM auf unterschiedliche L?

      Das auch.
      Trotzdem könnte die Spalte L-ID in der LM-Tabelle ersatzlos entfallen.

      Ich möchte, falls Eintrag in Tabelle LM vorhanden, in der Tabelle LM die Anzahl eines Postens LT.P-ID="ABC" updaten. Aber nur dann, wenn der zugehörige Eintrag in der Tabelle L die Art "XY" hat.

      Wie sieht das aus?

        
      UPDATE l-tabelle l  
      JOIN lt-tabelle lt  
      ON l.L-ID = lt.L-ID  
      LEFT JOIN lm-tabelle lm  
      ON lt.LT-ID = lm.LT-ID  
      SET lm.Anzahl = ".set_kontextwechsel($neue_Anzahl,'int')."  
      WHERE l.Art = 'XY' AND  
      lt.PID = ".set_kontextwechsel($t_id,'int')."  
      
      

      MySQLs UPDATE kennt eine Multi-Table-Variante. Die kann einerseits Daten in mehreren Tabellen ändern, andererseits können die Joins auch nur zum Finden der richtigen Daten in einer Tabelle herangezogen werden.

      Hast Du dafür mal ein Beispiel?

      Gruß, Frank

      1. Tach!

        MySQLs UPDATE kennt eine Multi-Table-Variante. Die kann einerseits Daten in mehreren Tabellen ändern, andererseits können die Joins auch nur zum Finden der richtigen Daten in einer Tabelle herangezogen werden.
        Hast Du dafür mal ein Beispiel?

        Dein geposteter UPDATE-Code ist eins, das in einer Tabelle ändert und weitere Tabellen zum Datensatzfinden hinzunimmt. Zum Ändern in mehreren Tabellen gibt man in der SET-Klausel auch noch die anderen Tabellenfelder an.

        dedlfix.