SQL更改数据相同的列的数据

时间:2017-12-09 11:55:43

标签: sql postgresql join sql-update

我创建了这个表:

     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
        );

使用此表我创建了这个:

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
    );

所以,现在我想更改Original表中名为“ImportaViolations”的数据,我想将此表中的“id_serial”列更新为表“Proces2”的“rn”列,但仅限于信息所在的位置完全一样。

我已经完成了下一个查询,但它不起作用。

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
);

是的,列“id_serial”在表ImportaViolations上作为空列存在(充满空值)。另外我不得不说ImportaViolations表上没有主键,所以我不介意我们在不同的行上设置id_serial重复值。

感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

在Postgres的SQL中,您不必重复 target 表的名称(并且您可以在没有中间临时表的情况下执行相同的工作):

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
        ;