Sql 如果子查询返回空,则在更新中为空列
我有以下SQL查询 问题是,如果子查询不返回任何内容,则不会更新成员容器。如果是这种情况,我需要将其设置为null。我尝试使用EXISTS子句,但它不起作用Sql 如果子查询返回空,则在更新中为空列,sql,postgresql,null,sql-update,correlated-subquery,Sql,Postgresql,Null,Sql Update,Correlated Subquery,我有以下SQL查询 问题是,如果子查询不返回任何内容,则不会更新成员容器。如果是这种情况,我需要将其设置为null。我尝试使用EXISTS子句,但它不起作用 UPDATE container SET member_containers = CASE WHEN EXISTS ( SELECT * FROM inter_container_membership WHERE container.id = inter_container_membe
UPDATE container SET member_containers =
CASE WHEN EXISTS (
SELECT * FROM inter_container_membership
WHERE container.id = inter_container_membership.owning_container_id
) THEN members
ELSE NULL END
FROM (
SELECT inter_container_membership.owning_container_id AS owner_cont
,array_to_string(array_agg(inter_container_membership.member_container_id),',') AS members
FROM inter_container_membership
GROUP BY inter_container_membership.owning_container_id) v
WHERE container.id = owner_cont;
因此,现在我考虑在更新成员容器之前将其清空,但我找不到这样做的方法。要在子查询找不到任何内容的情况下设置列NULL,可以使用相关子查询而不是联接: 更新容器c 设置成员容器= 选择字符串\u aggmember\u container\u id',' 来自inter_容器_成员i 其中i.owning_container_id=c.id 按拥有容器id分组 ; 通常,这种查询是错误的,因为如果找不到任何内容,该列不应为null。但你似乎正是这么想的。 此外,相关子查询的速度往往较慢。考虑添加这个左连接,而不是这样做: 更新容器c 设置成员\容器=i个成员 来自集装箱c1 左连接 选择拥有\u容器\u id ,字符串_aggmember_container_id,,'作为成员 来自inter_容器_成员 按1分组 i.i.u容器上的i\u id=c1.id 其中c.id=c1.id; 还使用而不是数组\u到字符串数组\u agg。。。。需要Postgres 9.0+。使用CTE:
WITH m AS (
SELECT icm.owning_container_id AS owner_cont,
array_to_string(array_agg(icm.member_container_id),',') AS members
FROM inter_container_membership icm
GROUP BY icm.owning_container_id)
UPDATE container SET member_containers = m.members
WHERE id = m.owner_cont;
快速修复:将子查询替换为。。。从成员左起加入内部容器成员身份。请将相关别名添加到列引用中。这与原来的问题相同:如果CTE找不到行,则什么也不会发生。CTE只是比子查询慢一点。这正是我认为第二个查询解决问题的原因,但是GROUP BY 1是什么意思呢?@SLEIMANANJNEIDI:1在GROUP BY 1中是对选择列表中第一项的位置引用。
WITH m AS (
SELECT icm.owning_container_id AS owner_cont,
array_to_string(array_agg(icm.member_container_id),',') AS members
FROM inter_container_membership icm
GROUP BY icm.owning_container_id)
UPDATE container SET member_containers = m.members
WHERE id = m.owner_cont;