UPDATE Spalte zu Ergebnissen von SELECT

Tommy57

Erfahrenes Mitglied
Hallo,

ich habe eine Tabelle mit Auktionsdaten. Hier sind die Baujahre oft unterschiedlich, müssen aber einheitlich sein. Wir haben uns entschieden alle auf das niedrigste Jahr zu setzen.

SQL:
id;model_id;vintage
1;1;1996
2;1;1994
3;1;1998
4;1;1996
5;1;1999
6;1;NULL
7;1;1998
8;2;2004
9;2;2006
10;2;2003

Ziel ist:
SQL:
1;1;1994
2;1;1994
3;1;1994
4;1;1994
5;1;1994
6;1;1994
7;1;1994
8;2;2003
9;2;2003
10;2;2003


Ich weiß nicht genau, ob das überhaupt mit einem Statement geht, da das SELECT und UPDATE auf die selbe Tabelle wäre. Wäre aber ganz gut, wenn das gehen würde. Das könnte irgendwie so aussehen.

SQL:
UPDATE
   auctions
SET
   vintage = ...?
(SELECT
    model_id,
    MIN(vintgage)
FROM
    auctions
GROUP BY
    model_id);
 
Zuletzt bearbeitet von einem Moderator:
DBMS? Habe mal Oracle angenommen...

Dann sehe ich da 2 Optionen:
1. Update queries dynamisch berechnen lassen, kopieren und ausführen
2. Cursor über dein Group By, loop über den Cursor und jeweils ein Update durchführen mit den Cursorattributen

1. ist wohl besser wenn du den Update nur einmal machen musst. 2. dann, wenn solche Updates regelmässiger vorkommen.

So könnte das für 1. aussehen:
SQL:
SELECT 'update auctions set vintage=' || MIN(vintage) OVER (PARTITION BY model_id) || ' where id=' || id || ';' AS query FROM auctions;
 
Zuletzt bearbeitet von einem Moderator:
sollte auch mit einer einfachen korrelierten Subquery gehen:

Code:
drop table t,

create table t (
    id number
  , model_id number
  , vintage number
);


insert into t values (1,1,1996 );
insert into t values (2,1,1994 );
insert into t values (3,1,1998 );
insert into t values (4,1,1996 );
insert into t values (5,1,1999 );
insert into t values (6,1,NULL );
insert into t values (7,1,1998 );
insert into t values (8,2,2004 );
insert into t values (9,2,2006 );
insert into t values (10,2,2003);

select * from t;

   ID   MODEL_ID    VINTAGE
----- ---------- ----------
    1          1       1996
    2          1       1994
    3          1       1998
    4          1       1996
    5          1       1999
    6          1
    7          1       1998
    8          2       2004
    9          2       2006
   10          2       2003

update t t_dest set vintage = (select min(vintage) from t t_ref where t_ref.model_id = t_dest.model_id);

10 Zeilen aktualisiert.

select * from t;

        ID   MODEL_ID    VINTAGE
---------- ---------- ----------
         1          1       1994
         2          1       1994
         3          1       1994
         4          1       1994
         5          1       1994
         6          1       1994
         7          1       1994
         8          2       2003
         9          2       2003
        10          2       2003
 
Hallo,

ich habe das versucht. Bei unserer Postgres Datenbank funktioniert das wunderbar.

Leider wirft die MySQL Datenbank, um die es hier auch geht, folgende Fehlermeldung aus:

Code:
#1093 - You can't specify target table 't_dest' for update in FROM clause

Jemand eine Idee?
 
Okay, das macht Sinn eine Subquery zu benutzen, aber wie kommt die Subquery nach dem Beispiel vom MPr an t_dest?

SQL:
UPDATE 
    t t_dest 
SET
    vintage = 
        (SELECT 
            min_vintage 
        FROM 
            (SELECT
                MIN(vintage) AS min_vintage 
            FROM
                t t_ref
            WHERE
                t_ref.model_id = t_dest.model_id) x0)
Code:
#1054 - Unknown column 't_dest.model_id' in 'where clause'

Die Geschichte mit dem JOIN ist mir auch schleierhaft. Wie soll ich denn im JOIN den MIN-Wert bekommen? Da habe ich doch das gleichte Problem wie oben?

Also ich brauche hier ja eigentlich MIN(t_ref.vintage):
SQL:
UPDATE t AS t_dest
    INNER JOIN t AS t_ref ON t_ref.model_id = t_dest.model_id
    SET t_dest.vintage = t_ref.vintage
 
Zuletzt bearbeitet von einem Moderator:

Neue Beiträge

Zurück