Ankündigung

Einklappen
Keine Ankündigung bisher.

SQL Datensätze in andere Tabelle kopieren und Ursprüng löschen

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • SQL Datensätze in andere Tabelle kopieren und Ursprüng löschen

    Hallo liebes Forum,

    ich hoffe ihr könnt mir helfen.
    Ich habe 2 von der Struktur komplett identische Tabellen (3 Spalten), jedoch ist Tabelle 1 im Ursprung mit Datensätzen befüllt und Tabelle 2 jungfräulich.

    Beispiel:

    TAB1:
    Spalten: Timestamp---Name---Vorname---

    TAB2:
    Spalten: Timestamp---Name---Vorname---

    Ich möchte nun erstmal alle Datensätze die älter als 14 Tage sind anhand des Timespamps selektieren:

    Code:
    SELECT TIMESTAMP, NAME, VORNAME FROM TAB1 TAB1
    WHERE (TAB1.TIMESTAMP >= CURRENT DATE - 14 DAYS)
    nun möchte ich das Ergebnis des SELECT's in die Tabelle 2 kopieren.
    Anschließend sollen aber alle Datensätze welche in die Tabelle 2 kopiert worden sind, aus der Tabelle 1 gelöscht werden.

    Einfach gesagt will ich Sie aus Tabelle 1 "ausschneiden" und in Tablle 2 "einfügen".

    Beispiel:
    Zu Beginn waren 100 Datensätze in TAB1, davon waren 20 älter als 14 Tage.
    TAB2 war leer.

    Nach Durchführung meiner gewünschten Abfrage wären am Ende 80 Datensätze in TAB1 und die restlichen 20 in die TAB 2 kopiert.

    Mir ist klar, dass ich mit INSERT INTO TAB2... den Kopiervorgang problemlos hinbekomme, aber es soll aus sicherheitsgründen alles in einer Abfrage passieren.

    Habe im Netz etwas von MERGE in Kombination mit WHEN MATCHED gelesen, bekomme es damit aber nicht umgesetzt.

    Ich hoffe ihr könnt mir helfen.

    Vielen lieben Dank schon mal vorab.

    Viele Grüße,
    Thomas

  • #2
    Zitat von ICEMAN2410 Beitrag anzeigen
    Mir ist klar, dass ich mit INSERT INTO TAB2... den Kopiervorgang problemlos hinbekomme, aber es soll aus sicherheitsgründen alles in einer Abfrage passieren.

    Du hast:

    Code:
    test=# create table quelle (id int primary key, datum date, val int);CREATE TABLE
    Time: 4,551 ms
    test=*# create table ziel (id int primary key, datum date, val int);CREATE TABLE
    Time: 1,805 ms
    test=*# insert into quelle values (1, '2014-01-01', 10);INSERT 0 1
    Time: 0,519 ms
    test=*# insert into quelle values (2, '2014-02-01', 20);INSERT 0 1
    Time: 0,216 ms
    test=*# insert into quelle values (3, '2014-10-01', 30);INSERT 0 1
    Time: 0,164 ms

    Move in einer Abfrage:

    Code:
    test=*# with move as (delete from quelle where datum < current_date -30 returning *), moved as (insert into ziel (select * from move)) select * from move ;
     id |   datum    | val
    ----+------------+-----
      1 | 2014-01-01 |  10
      2 | 2014-02-01 |  20
    (2 rows)
    Kontrolle

    Code:
    est=*# select * from quelle ;
     id |   datum    | val
    ----+------------+-----
      3 | 2014-10-01 |  30
    (1 row)
    
    Time: 0,179 ms
    test=*# select * from ziel;
     id |   datum    | val
    ----+------------+-----
      1 | 2014-01-01 |  10
      2 | 2014-02-01 |  20
    (2 rows)
    Man kann natürlich auch Transaktionen nehmen.
    PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

    Kommentar

    Lädt...
    X