从union select语句更新表

时间:2016-05-18 15:23:47

标签: postgresql postgresql-9.1

我有两张表格如下:

表A

 k |  1    | 2 
--------------------
 a | mango | xx
 b | orange| xx
 c | xx    | apple
 d | xx    | banana
 a | xx    | mango

表B

 k |  1    | 2 
--------------------
 a |       | 
 b |       |  
 c |       |  
 d |       | 

如何从tableb更新tablea,以便我得到以下结果?

表B

 k |  1    | 2 
--------------------
 a | mango | mango
 b | orange| xx
 c | xx    | apple
 d | xx    | banana

如果我尝试使用如下所示的更新语句

update tableb 
set 1 = x.1,
    2 = x.2
from 
 (
    select * from tablea
) x 
where tablea.k = x.k 

如果xx重复,我可以使更新语句忽略k吗?

感谢。

1 个答案:

答案 0 :(得分:1)

这是SELECT,希望你能进行更新。

  1. 尝试使用名称<>搜索左侧每个匹配项的匹配项'XX'
  2. 然后与我尚未使用的其他行联合。
  3. <强> SQL Fiddle Demo

    SELECT t1."k", t1."1", COALESCE(t2."2", 'xx') "2"
    FROM tablea t1
    LEFT JOIN tablea t2
           ON  t1."1" = t2."2"
    WHERE t1."1" <> 'xx'
    UNION ALL
    SELECT t1."k", t1."1", t1."2"
    FROM tablea t1
    WHERE t1."1" = 'xx'
      AND t1."2" NOT IN (SELECT t2."1" FROM tablea t2 WHERE t2."1" <> 'xx')