我有两张桌子,organization张和address张.

organization表有address_id列,但所有行的address_id都设置为NULL.

我想将组织表中的address_id设置为地址表中的随机ID,但我也希望所有ID都是唯一的.

这就是我try 过的:

UPDATE organization
SET address_id = (SELECT id
                  FROM address
                  WHERE id NOT IN (SELECT address_id FROM organization WHERE address_id IS NOT NULL)
                  LIMIT 1)

但是,子查询不会在每次更新后获得更新值.

What I'm expecting/trying to do:
Assuming on the first update sets address_id to 6, then on the next update 6 should not be returned since 1 organization already has the address_id 6.

But all rows in organization end up having the same address_id.
How can I go about this?

推荐答案

此查询将每个的下一个空闲地址ID分配给还没有空闲地址ID的每个组织:

UPDATE organization
SET    address_id = a1.id
FROM  (
   SELECT a.id, row_number() OVER () AS link_id  -- arbitrary number (not strictly random)
   FROM   address a
   WHERE  NOT EXISTS (SELECT FROM organization o WHERE o.address_id = a.id)
   ) a1
JOIN (
   SELECT o.id, row_number() OVER () AS link_id  -- arbitrary number (not strictly random)
   FROM   organization o
   WHERE  address_id IS NULL
   ) o1 USING (link_id)
WHERE  o1.id = o.id;

Prepare the assignments in subqueries in the FROM clause to the UPDATE.
Read the manual on UPDATE here.

假设没有并发写入访问.否则,您必须锁定这两个表以确保安全.

如果没有足够的空闲地址,一些组织会保留address_id IS NULL个.

Sql相关问答推荐

如何重用表值用户定义函数调用的结果?

获取每个帖子的匹配关键字列表

仅在特定字符串之后提取两个圆括号之间的计量单位文本

重新组合已排序的日期范围

将结果从一列转换为两行或更多

对于多字节字符,SQL Server中的DATALENGTH返回1字节

使用与JOIN一起使用的查询后进行分页和排序

SQL仅返回第一个字母在A-Z之间的值

当active=1时,是否可以创建id为的唯一索引?

将用户授予另一个用户不授予权限

如何使用SQL生成数据的滚动3天总和

从重复值中获取最新值

SQL JSON_QUERY 使用列中的值构造 json 路径并接收错误

我需要在 ASP.NET C# 中获取 2 个 SQL 查询结果的平均值

确定小数中使用的精度位数

根据要过滤的列的值进行联接和分组

SQL获取两个日期范围之间的计数

函数调用作为插入值语句中的参数

在 postgresql 中,我可以将其组合成一个查询吗?

将单行中的多个行值转换为列