使用内部联接集的Postgresql更新

时间:2014-10-28 17:56:09

标签: sql postgresql join case

我有两个表共享两个字段(myfield1,myfield2),其中一个表有两个其他感兴趣的字段。

这是我想要做的: 1.内部加入两个表 2.使用其他表中的字段(afield或otherfield)更新Table2中的列(field1),具体取决于是否为null。

下面的代码运行正常,但目标设置字段(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;

1 个答案:

答案 0 :(得分: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);

它被称为相关子查询,它对表2中的每一行执行。但是您必须确保子查询返回单行或零行。

如果您只想更新Table1中存在的那些需要WHERE的行,那么此查询将更新Table2中的所有行

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);