2017-04-21 61 views
0

我可以更新,罚款,我可以删除罚款,但我想同时做两个。更新哪里存在删除行哪里没有

我有一个表弊这样,列名

ref,fname,lname,add1,add2,add3,add4 

A1 a b c d h j 
S2 f d s e y t 
B3 j f s e o p 

其中第一列是唯一

那么这样

ref,fname,lname,add1,add2 

A1 b c d e 
B3 k g h t 

另一个表中的数据我想更新第一个表使用第二个并删除任何不具有唯一性的行

所以最终结果需要如下表ORIG

A1 b c d e h j 
B3 k g h t o p 

我能够一气呵成吗?

回答

2

我可能接近这个使用CTE:

with u as (
     update orig 
      set b = d.b, . . . 
      from data d 
      where d.a = orig.a 
     returning * 
    ) 
delete from orig 
    where not exists (select 1 from u where u.a = d.a); 

第一CTE更新行。第二个是删除。

+0

做'没有任何好处'(从u中选择1,其中ua = da' vs'da不在(从u选择ua)“? –

+0

给我一个语法错误ERROR:语法错误处于或接近”from“ LINE 8:删除原始文件 ^ – Kilisi

+1

@Kilisi:这是一个错误的答案,你需要删除CTE后的',' –

0

您可以使用相关子查询此:

delete 
from orig o 
where not exists (
     select 1 
     from data d 
     where d.col1 = o.col1 
     ) 
+0

但是......当密钥匹配时,操作需要更新。 –