【问题标题】:Update a table from a union select statement从联合选择语句更新表
【发布时间】:2016-05-18 15:23:46
【问题描述】:

我有两张表如下:

表格

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

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

表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 

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

谢谢。

【问题讨论】:

  • 如何确定 row1 (k='a') 将是 mango, mango 而不是 xx,xx 或 mango,xx?
  • @PhamX.Bach 我在跳 xx 意思是 null?但是,是的,我们需要更多信息。
  • @JuanCarlosOropeza 如果xx 表示null 那么我会问tablea 是否还有另一行a | orange | banana 那么tableb 应该是什么。 Taz你的问题需要更多关于tablea中数据的逻辑以及如何更新tableb
  • hi 'xx' 只是两个字符(类似于 'N/A')。在tablea中,背后有一个很大的后端计算,最终只给我带来了这5行。我不会得到像'a |橙色 |香蕉'

标签: postgresql postgresql-9.1


【解决方案1】:

这里是SELECT,希望你能做出更新。

  1. 尝试搜索左侧名称为 'xx' 的每个匹配项
  2. 然后与我还没有使用它的其余行合并。

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

【讨论】:

    猜你喜欢
    • 2013-06-07
    • 1970-01-01
    • 1970-01-01
    • 2019-06-03
    • 1970-01-01
    • 1970-01-01
    • 2021-08-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多