2017-12-09 1 views
0

ich geschaffen habe diese Tabelle:SQL Daten ändern einer Spalte, in der Daten ist die gleiche

 DROP TABLE IF EXISTS Proces1 CASCADE; 
     CREATE TABLE Proces1 AS 
     (
     SELECT id_importat AS id_aux, driver_city AS city_aux, 
     driver_state AS state_aux, gender AS g_aux, race AS r_aux 
      FROM ImportaViolations 
      WHERE id_importat IN (
       SELECT id_importat 
       FROM ImportaViolations 
       GROUP BY id_importat  
       HAVING (COUNT(*) > 1)) 
      GROUP BY id_importat, driver_city, driver_state, gender, race 
     ); 

Und mit dieser Tabelle habe ich erstellt diese:

DROP TABLE IF EXISTS Proces2 CASCADE; 
CREATE TABLE Proces2 AS 
(
    SELECT id_aux AS id_aux2, city_aux AS city_aux2, state_aux AS state_aux2, 
    g_aux AS g_aux2, r_aux AS r_aux2, rn 
     FROM (
       SELECT id_aux, city_aux, state_aux, 
       g_aux, r_aux, row_number() OVER(PARTITION BY id_aux ORDER BY 1) AS rn 
       FROM Proces1 
      ) d 
     WHERE rn > 1 
    ); 

So, jetzt will ich Ändern Sie Daten aus der Original-Tabelle namens "ImportaViolations", und ich möchte die Spalte "id_serial" aus dieser Tabelle in die Spalte "rn" der Tabelle "Proces2" aktualisieren, aber nur dort, wo Informationen genau gleich sind.

Ich habe die nächste Abfrage gemacht, aber es funktioniert nicht.

UPDATE ImportaViolations 
SET id_serial = p2.rn 
FROM ImportaViolations iv, Proces2 p2 
WHERE (iv.id_importat, iv.driver_city, iv.driver_state, iv.gender, iv.race) IN (
    SELECT id_aux2, city_aux2, state_aux2, g_aux2, r_aux2 
    FROM Proces2 
); 

Und ja, die Spalte „ID_SERIAL“ existiert auf dem Tisch ImportaViolations als eine leere Spalte (voller Nullwerte). Ich muss auch sagen, dass es keinen Primärschlüssel für die ImportaViolations-Tabelle gibt, so dass es mir nichts ausmacht, wenn wir die wiederholten Werte von id_serial auf verschiedenen Zeilen setzen.

Danke für Ihre Hilfe!

+0

'VON ImportaViolations iv, Proces2 p2' ist ein kartesisches Produkt und die Unterabfrage 'FROM Proces2' ist unkorreliert.BTW: Ihre Absicht ist nicht sehr klar. Möchten Sie den Duplikaten eine Rangnummer geben? – wildplasser

+1

[Zitat aus dem Handbuch] (https://www.postgresql.org/docs/current/static/sql-update.html): "* Beachten Sie, dass die Zieltabelle nicht in der from_list erscheinen darf, außer Sie beabsichtigen ein self -Beitreten*" –

Antwort

1

In Postgres SQL, müssen Sie den Namen der Ziel Tabelle nicht wiederholen (und man konnte die gleiche Arbeit ohne Zwischen Temptabellen wahrscheinlich tun):


UPDATE ImportaViolations iv 
SET id_serial = p2.rn 
FROM Proces2 p2 
WHERE iv.id_importat = p2.id_aux2 
     AND iv.driver_city = p2.city_aux2 
     AND iv.driver_state = p2.state_aux2 
     AND iv.gender = p2.g_aux2 
     AND iv.race = p2.r_aux2 
     ; 
Verwandte Themen