我创建了这个表:
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重复值。
感谢您的帮助!
答案 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
;