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 语句的主要内容,如果未能解决你的问题,请参考以下文章

条件包含 IN 语句的 CASE 语句 redshift

对指定 VALUE 使用 UPDATE 时出现 Amazon Redshift 语法错误

Redshift - 将 UTC 数据转换为其他时区

UPDATE CASE 中的 SIGNAL SQLSTATE

使用 case when 时出现 SQL (Redshift) 错误 - 不支持这种类型的相关子查询模式

RedShift 中更新语句中的表别名