2017-10-15 2 views
2

Ich schreibe kleines Update für Home-Inventar, die Menge für Produkt mit dem ältesten Ablaufdatum ändert (meine Art, FIFO zu erreichen). Unten ist das Beispiel, das ich auszuführen versuchte, aber ohne Glück.Update-Tabelle, wo Spalte ist MIN

UPDATE stan 
SET Ilosc=Ilosc-1 
WHERE Date_exp=(SELECT MIN(Date_exp) AS Date_exp FROM stan as sta WHERE ID_Product=1) 

Obiges Beispiel endet mit folgenden Fehler:

1093 - Table 'stan' is specified twice, both as a target for 'UPDATE' and as a separate source for data

jemand mich in die richtige Richtung zeigen kann?

+0

schreiben Sie es als (zum Beispiel) eine uncorellated Unterabfrage statt – Strawberry

+0

ich undestand nicht, was meinst du. ich habe ‚WHERE‘ ohne ‚SELECT‘ schreiben? – bgolemba

+0

erstellen eine temporäre Tabelle tmp [select min (date_exp) als date_exp FRO M stan WHERE ID_Product = 1) sta], dann UPDATE stan a SET a.Ilosc = a.Ilosc-1 WHERE a.Date_exp in (Wählen Sie date_exp aus tmp). Versuchen Sie es, es sollte gut funktionieren. –

Antwort

0

ich nur order by verwenden würde und limit:

UPDATE stan 
    SET Ilosc = Ilosc - 1 
    WHERE id_product = 1 
    ORDER BY Date_exp 
    LIMIT 1; 

Dies hat zwei entscheidende Vorteile gegenüber Ihrem Ansatz. Erstens ist es einfacher und erfordert keine Hacks, um die Einschränkungen von MySQL beim Verweis auf die zu aktualisierende Tabelle zu umgehen.

Zweitens ist die Logik korrekt. Ihr Code kann Zeilen mit der Produkt-ID 1 aktualisieren, da Sie in der äußeren Abfrage keine Einschränkung haben. Mehrere Zeilen mit unterschiedlichen Produkt-IDs können dasselbe Mindestdatum haben.

Wenn Sie nicht, diesen Ansatz nehmen wollen (etwa weil Sie bereits ein JOIN im UPDATE) haben, können Sie tun:

UPDATE stan s JOIN 
     (SELECT id_product, MIN(Date_exp) as minde 
     FROM stan s2 
     WHERE id_product = 1 
     GROUP BY id_product 
     ) s2 
     ON s.id_product = s2.id_product AND s.Date_exp = s2.minde 
    SET Ilosc = Ilosc - 1; 

Ich könnte auch in einem Zustand werfen, dass Ilosc > 0 wenn das Ihre Absicht.

1

MySQL erlaubt Ihnen nicht, ein UPDATE/INSERT/DELETE für eine Tabelle durchzuführen, wenn Sie diese Tabelle in einer inneren Abfrage referenzieren. Allerdings ist die Problemumgehung eine temporäre Tabelle in Ihrer Unterabfrage zu verwenden, etwa so:

UPDATE stan a 
SET a.Ilosc=a.Ilosc-1 
WHERE a.Date_exp = 
(SELECT Date_exp from 
    (select min(date_exp) as date_exp 
     FROM stan 
     WHERE ID_Product=1) sta 
); 

Hoffe, es hilft.

-1
UPDATE A 
SET A.COLUMN_NAME=VALUE 
FROM TABLE_NAME A 
INNER JOIN (SELECT MIN(COLUNN_NAME) FROM TABLE_NAME) B ON (A.COLUMN_NAME=B.COLUMN_NAME); 
-1

Versuchen Sie unter Abfrage. und folgen Sie diesem Link (https://dev.mysql.com/doc/refman/5.6/en/update.html)

UPDATE stan 
SET Ilosc=Ilosc-1 
WHERE Date_exp=(SELECT Date_exp FROM (SELECT MIN(Date_exp) AS Date_exp FROM `stan` AS sta WHERE ID_Product = 1) AS t) 
+0

Downvoter freundlich erklären, was ist falsch in oben genannten Abfrage? – sheraz

+0

Ich denke für fehlende Erklärung in Ihrer Antwort :) –

+0

Oho okay. Das nächste Mal werde ich klar erklären :) – sheraz

Verwandte Themen