PostgreSQL 中,把A表某个字段的数据,随机填充到B表中的字段中,批量更新

需求说明:

使用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;

思路:

  1. a_data: 从 a 表中选择 sfzh 和 phone 不为空的记录。
  2. b_data: 从 b 表中选择 sfzh 和 phone 为空的记录,并生成一个行号 rn。
  3. random_a: 为 a 表中的记录生成行号 rn。
  4. random_b: 为 b 表中的记录生成行号 rn。
  5. 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;

至此就可以完成批量更新了!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值