【问题标题】:update + case + join statement in RedshiftRedshift 中的 update + case + join 语句
【发布时间】: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 中工作?谢谢。

【问题讨论】:

标签: sql sql-update case amazon-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 可能不支持它。
    猜你喜欢
    • 1970-01-01
    • 2019-12-19
    • 1970-01-01
    • 1970-01-01
    • 2015-05-05
    • 2020-10-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多