Redshift使用INNER JOIN执行UPDATE时报等值连接错误的原因排查
Redshift UPDATE报错「Target table must be part of an equijoin predicate」的解决方法
你的问题出在Redshift对UPDATE语句的语法限制上:更新的目标表必须直接参与到FROM子句的等值连接逻辑中,而你的写法里,外层要更新的jwan.photos_audit_v4和FROM子句里的别名表t(同一个物理表)之间没有任何关联条件,Redshift无法确定要更新的行和FROM查询结果里的行是如何对应的,哪怕你用了INNER JOIN也没用。
修正后的两种写法:
写法一:直接关联目标表和临时表
-- expire previous photos that have been replaced update jwan.photos_audit_v4 set expiry_date = s.user_updated from _sc95897_tmp_photos_audit_v4 as s where jwan.photos_audit_v4.user_id = s.user_id and jwan.photos_audit_v4.position = s.position and jwan.photos_audit_v4.expiry_date is null and s.idx = 1 ;
写法二:显式关联目标表和FROM中的别名表
如果你需要保留原有的表别名逻辑,可以给目标表也加别名,然后通过等值条件关联FROM里的t表:
-- expire previous photos that have been replaced update jwan.photos_audit_v4 as target set expiry_date = s.user_updated from jwan.photos_audit_v4 as t INNER JOIN _sc95897_tmp_photos_audit_v4 as s on t.user_id = s.user_id and t.position = s.position WHERE target.user_id = t.user_id and target.position = t.position and t.expiry_date is null and s.idx = 1 ;
本质上,Redshift要求UPDATE的目标表必须在WHERE或FROM的JOIN条件里,和其他表有明确的等值匹配,否则无法安全地定位要更新的行。
内容的提问来源于stack exchange,提问作者Jwan622
相关产品推荐
相关产品推荐

