Ergebnis 1 bis 4 von 4

Thema: [SQL] Komplette Spalte ersetzen mithilfe einer Zuordnungstabelle

  1. #1
    Bot #0384479 Avatar von BurnerR
    Registriert seit
    Jul 2013
    Beiträge
    4.686
    ngb:news Artikel
    3

    [SQL] Komplette Spalte ersetzen mithilfe einer Zuordnungstabelle

    Ich habe hier einen table T, der hat u.a. eine Spalte 'internal_id' mit unique Einträgen "AAAA", "AAAB", "AAAC", ...
    Desweiteren habe ich eine zuordnungstabelle mit den Spalten ['internal_id', 'new_id'] mit Einträgen ["AAAA", "XXXX"]. ["AAAB", "XXX1"], ["AAAC", "XXX2"]. Die Einträge in 'new_id' sind auch unique.
    Wie kann ich (in mysql) alle Einträge in internal_id im table T durch die zugehörigen in new_id ersetzen?
    Muss ich da mit den spaltennamen herumschrauben? Mich würde interessieren, wie das mit UPDATE und SELECT geht.
    Gerne auch, wie das hypothetisch mit PostgreSQL ginge - rein aus Interesse.

  2. #2
    Boomer ♪♪♫♪♫♫♪

    News-Redakteur

    Avatar von KaPiTN
    Registriert seit
    Jul 2013
    Beiträge
    20.198
    ngb:news Artikel
    31

    Re: [SQL] Komplette Spalte ersetzen mithilfe einer Zuordnungstabelle

    Scheint nicht mehr als dies zu sein:

    Update T set internal_id =(Select new_id from T2 Where internal_id=T.internal_id) ;


    Ich habe gerade folgendes gemacht:
    Code (MySQL):
    1.  
    2. create table T(internal_id varchar(5));
    3. insert into T(internal_id ) values('AAAAA');
    4. insert into T(internal_id ) values('AAAAB');
    5. insert into T(internal_id ) values('AAAAC');
    6. insert into T(internal_id ) values('AAAAD');
    7.  
    8. create table T2(internal_id varchar(5),new_id varchar(5));
    9. insert into T2 (internal_id,new_id) values('AAAAA', 'XXXX1');
    10. insert into T2 (internal_id,new_id) values('AAAAB', 'XXXX2');
    11. insert into T2 (internal_id,new_id) values('AAAAC', 'XXXX3');
    12. insert into T2 (internal_id,new_id) values('AAAAD', 'XXXX4');
    13.  
    14. Update T set internal_id =(Select new_id from T2 Where internal_id=T.internal_id) ;
    15.  
    16.  
    Output:
    AAAAA
    AAAAB
    AAAAC
    AAAAD
    XXXX1
    XXXX2
    XXXX3
    XXXX4
    J'irai pisser sur votre bombes
    You can educate a fool, but you cannot make him think

  3. #3
    Bot #0384479

    (Threadstarter)

    Avatar von BurnerR
    Registriert seit
    Jul 2013
    Beiträge
    4.686
    ngb:news Artikel
    3

    Re: [SQL] Komplette Spalte ersetzen mithilfe einer Zuordnungstabelle

    Ah, ja vielen Dank für die Schützenhilfe!
    Hab mir schon fast gedacht, dass es nicht so schwierig ist... es war sehr montagig gestern

  4. #4
    Mitglied
    Registriert seit
    Aug 2015
    Beiträge
    122

    Re: [SQL] Komplette Spalte ersetzen mithilfe einer Zuordnungstabelle

    Das funktioniert aber nur, wenn die neuen IDs nicht schon in den alten enthalten sind. In der folgenden Variation kann das Update nicht ausgeführt werden weil keys (temporär) doppelt wären.
    Code (MySQL):
    1. create table T(internal_id varchar(5) PRIMARY KEY);
    2. insert into T(internal_id ) values('AAAAA');
    3. insert into T(internal_id ) values('AAAAB');
    4. insert into T(internal_id ) values('AAAAC');
    5. insert into T(internal_id ) values('AAAAD');
    6.  
    7. create table T2(internal_id varchar(5),new_id varchar(5));
    8. insert into T2 (internal_id,new_id) values('AAAAA', 'AAAAD');
    9. insert into T2 (internal_id,new_id) values('AAAAB', 'AAAAC');
    10. insert into T2 (internal_id,new_id) values('AAAAC', 'AAAAA');
    11. insert into T2 (internal_id,new_id) values('AAAAD', 'AAAAB');
    12.  
    13. Update T set internal_id =(Select new_id from T2 Where internal_id=T.internal_id) ;
    Wenn das eine Voraussetzung ist musst du vermutlich tatsächlich die Spalten modifizieren:
    Code (MySQL):
    1. create table T(internal_id varchar(5) PRIMARY KEY,
    2.                val INT);
    3. insert into T(internal_id, val ) values('AAAAA', 1);
    4. insert into T(internal_id, val ) values('AAAAB', 2);
    5. insert into T(internal_id, val ) values('AAAAC', 3);
    6. insert into T(internal_id, val ) values('AAAAD', 4);
    7.  
    8. create table T2(internal_id varchar(5),new_id varchar(5));
    9. insert into T2 (internal_id,new_id) values('AAAAA', 'AAAAD');
    10. insert into T2 (internal_id,new_id) values('AAAAB', 'AAAAC');
    11. insert into T2 (internal_id,new_id) values('AAAAC', 'AAAAA');
    12. insert into T2 (internal_id,new_id) values('AAAAD', 'AAAAB');
    13.  
    14. ALTER TABLE T ADD new_id varchar(5) AFTER internal_id;
    15. UPDATE T JOIN T2 ON T.internal_id = T2.internal_id
    16.     SET T.new_id = T2.new_id;
    17. ALTER TABLE T DROP internal_id;
    18. ALTER TABLE T CHANGE new_id internal_id varchar(5) PRIMARY KEY;
    (spalte val dient nur zur Veranschaulichung)

    Oder noch einfacher: den primary key entfernen und hinterher wieder hinzufügen:
    Code (MySQL):
    1. UPDATE T JOIN T2 ON T.internal_id = T2.internal_id
    2.     SET T.internal_id = T2.new_id;
    Geändert von exomo (26.11.19 um 22:25 Uhr)

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •