Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 如果子查询返回空,则在更新中为空列_Sql_Postgresql_Null_Sql Update_Correlated Subquery - Fatal编程技术网

Sql 如果子查询返回空,则在更新中为空列

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

我有以下SQL查询

问题是,如果子查询不返回任何内容,则不会更新成员容器。如果是这种情况,我需要将其设置为null。我尝试使用EXISTS子句,但它不起作用

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;