使用内部联接集更新Postgresql

使用内部联接集更新Postgresql,sql,postgresql,join,case,Sql,Postgresql,Join,Case,我有两个表,它们共享两个字段(myfield1、myfield2),其中一个表有另外两个感兴趣的字段 以下是我想做的: 1.将两个表连接起来 2.根据afield是否为null,使用另一个表中的字段(afield或另一个字段)更新表2中的列(field1) 下面的代码运行正常,但目标集合字段(field1)没有得到任何更新 Update Table2 Set field1 = ( CASE WHEN os.afield is not null

我有两个表,它们共享两个字段(myfield1、myfield2),其中一个表有另外两个感兴趣的字段

以下是我想做的: 1.将两个表连接起来 2.根据afield是否为null,使用另一个表中的字段(afield或另一个字段)更新表2中的列(field1)

下面的代码运行正常,但目标集合字段(field1)没有得到任何更新

Update Table2
Set field1 = (
    CASE 
        WHEN os.afield is not null 
            THEN (os.afield) 
            Else os.anotherfield  
        End
    )
from Table1 os
inner join Table2 fd
ON fd.myfield1= os.myfield1
AND fd.myfield2 = os.myfield2;
它被称为一个相关子查询,对表2中的每一行执行。但您必须确保子查询返回单行或零行

如果只想更新表1中存在的需要WHERE的行,则此查询将更新表2中的所有行

Update Table2 fd
   Set fd.field1 = 
      (select CASE WHEN os.afield is not null THEN (os.afield) Else os.anotherfield End 
         from Table1 os 
        where fd.myfield1= os.myfield1 
          AND fd.myfield2 = os.myfield2)
where exists (
        select 1 from Table1 os 
        where fd.myfield1= os.myfield1 
          AND fd.myfield2 = os.myfield2);
Update Table2 fd
   Set fd.field1 = 
      (select CASE WHEN os.afield is not null THEN (os.afield) Else os.anotherfield End 
         from Table1 os 
        where fd.myfield1= os.myfield1 
          AND fd.myfield2 = os.myfield2)
where exists (
        select 1 from Table1 os 
        where fd.myfield1= os.myfield1 
          AND fd.myfield2 = os.myfield2);