Redshift 中的 update + case + join 语句
Posted
技术标签:
【中文标题】Redshift 中的 update + case + join 语句【英文标题】:update + case + join statement in Redshift 【发布时间】:2019-09-20 21:05:54 【问题描述】:我有这段来自 SQL Server 的代码,我必须在 Redshift 中实现。
update t1 set some_flag = (case when b.some_value is null then false else true end)
from t1 a
left join t2 b on a.code = b.code;
我在 Redshift 中收到一条错误消息:
Target table must be part of an equijoin predicate
如何修改上述内容以使其在 Redshift 中工作?谢谢。
【问题讨论】:
Update table based on self table lookup in redshift的可能重复 【参考方案1】:您必须使用列而不是别名来完全限定表名。我猜 Redshift 不支持更新命令中的表别名。
update merge_demo1
set lastname = (case when merge_demo1.lastname = merge_demo1.lastname then merge_demo1.lastname else merge_demo2.lastname end)
from merge_demo2
where merge_demo1.id = merge_demo2.id;
【讨论】:
【参考方案2】:尝试删除from
子句中的引用:
update t1
set some_flag = (case when b.some_value is null then false else true end)
from t2 b
where t1.code = b.code;
Postgres(和 Postgres 派生的数据库)允许 FROM
子句用于 UPDATE
。但是,表引用是 除了UPDATE
中引用的表之外的。这与 SQL Server 不同,后者假定UPDATE
中的表引用来自FROM
子句,如果可能的话——甚至在必要时忽略别名。
您应该能够将其简化为:
update t1
set some_flag = (b.some_value is not null);
from t2 b
where t1.code = b.code;
【讨论】:
抱歉,不行。 Redshift 说“关系“a”不存在” 我尝试使用“t1 a”,但我猜你不能在更新上下文中使用别名 @ChuckPedro 。 . .那应该是t1
。我希望别名可以工作,但 Redshift 可能不支持它。以上是关于Redshift 中的 update + case + join 语句的主要内容,如果未能解决你的问题,请参考以下文章
使用 case when 时出现 SQL (Redshift) 错误 - 不支持这种类型的相关子查询模式
在 redshift 中使用正则表达式和 casestatements 语句