需求说明:
使用a表的sfzh和phone数据随机填充b表sfzh和phone为空的数据,原始语句如下:
select * from public.table_a a where sfzh is not null and phone is not null;
select * from public.table_b b where hh !='G' and sfzh is null and phone is null;
思路:
- a_data: 从 a 表中选择 sfzh 和 phone 不为空的记录。
- b_data: 从 b 表中选择 sfzh 和 phone 为空的记录,并生成一个行号 rn。
- random_a: 为 a 表中的记录生成行号 rn。
- random_b: 为 b 表中的记录生成行号 rn。
- UPDATE: 通过行号 rn 来联接 random_a 和 random_b,并根据 b 表中的 ctid 更新记录。
更新语句:
-- 批量更新语句
WITH a_data AS (
SELECT sfzh, phone
FROM public.table_a
WHERE sfzh IS NOT NULL AND phone IS NOT NULL
),
b_data AS (
SELECT ctid
FROM public.table_b
WHERE hh != 'G' AND sfzh IS NULL AND phone IS NULL
),
random_a AS (
SELECT sfzh, phone, ROW_NUMBER() OVER () AS rn
FROM a_data
),
random_b AS (
SELECT ctid, ROW_NUMBER() OVER () AS rn
FROM b_data
)
UPDATE public.table_b b
SET sfzh = a.sfzh,
phone = a.phone
FROM random_a a
JOIN random_b rb ON a.rn = rb.rn
WHERE b.ctid = rb.ctid;
至此就可以完成批量更新了!