【问题标题】:How to update a Postgres table with a join statement?如何使用连接语句更新 Postgres 表?
【发布时间】:2013-11-10 07:55:58
【问题描述】:

我想做这样的事情:

update t1 set t1.column1 = 'changed'
from left outer join t2 on t1.dataid = t2.dataid
where t2.column2 != 'foo';

基本上,在决定要更新哪些t1 记录时,我需要检查t2 中的某些内容。我怎样才能使它在语法上正确?

【问题讨论】:

标签: database postgresql syntax left-join outer-join


【解决方案1】:

与执行 LEFT JOIN 相比,在 WHERE 子句中建立与另一个表的关联更为简单,因为相关表中的值不必传输到更新后的表中。

看起来像这样:

update t1 set t1.column1 = 'changed'
where not exists (select 1 from t2 where t1.dataid = t2.dataid and t2.column2='foo');

【讨论】:

  • 这几乎可行,这是我的更正:update t1 set column1 = 'changed' where exists (select 1 from t2 where t1.dataid = t2.dataid and t2.column2 != 'foo');(从导致错误的t1.column1 中删除了t1.,并更改了 where 逻辑以适合我的具体情况。)谢谢!
【解决方案2】:

尝试类似:

update t1 
set t1.column1 = 'changed'
from t2
where t1.dataid = t2.dataid
  and t2.column2 != 'foo';

如果你真的需要外连接试试:

update t1
set t1.column1 = 'changed'
from (select 1 as dummy) dummy_table
left join t2 on t1.dataid = t2.dataid
            and t2.column2 != 'foo';

尚未测试 - 它可能无法正常工作。

另一种可能的方法是对t1 的“副本”进行内连接,然后对t2 进行左连接

【讨论】:

  • 这会给我一个隐含的inner join。我需要一个outer join(我也想影响以空值连接的记录)。
  • @BLuFeNiX 我更新了我的回答,提供了左连接的可能方法。
  • 刚刚尝试并收到此错误:错误:对表“t1”的 FROM 子句条目的无效引用第 4 行:在 t1.dataid = t2.dataid 上左连接 t2
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-19
  • 2014-08-13
  • 1970-01-01
相关资源
最近更新 更多