无法用左连接编写更新语句
Posted
技术标签:
【中文标题】无法用左连接编写更新语句【英文标题】:unable to write an update statement with left join 【发布时间】:2021-02-05 00:57:48 【问题描述】:我的更新语句与 INNER JOIN 一起工作正常,但当我用 LEFT JOIN 替换它时出现错误。我怎样才能在这里实现左加入? 我正在寻找 LEFT JOIN 结果,如果相应的 rn =2 不存在,那么我需要更新表中的 null。
with cte as (
select * from
( select row_number() over(partition by user_id order by loginDate desc) rn,
min(loginDate) over(partition by user_id) min_date,
max(loginDate) over(partition by user_id) max_date,
dau.* from DAILY_Active_user_table dau ) as foo
where rn <= 2
)
update user_agg_activity
SET first_login_date = cte.min_date,
last_login_date = cte.max_date,
prev_login_date = cte.loginDate,
date_partition = current_date
from user_agg_activity uac, cte
where cte.user_id = user_agg_activity.user_id;
--group by uac.user_id
【问题讨论】:
【参考方案1】:对user_agg_activity
的引用过多。 FROM
中的引用与UPDATE
中的引用完全不同,因此它产生笛卡尔积。所以:
update user_agg_activity uac
SET first_login_date = cte.min_date,
last_login_date = cte.max_date,
prev_login_date = cte.loginDate,
date_partition = current_date
from cte
where cte.user_id = uac.user_id;
【讨论】:
如果没有对应的 rn=2,我希望将 prev_login_date 更新为 null,此查询仍然不会这样做。 这里是https://dbfiddle.uk/?rdbms=postgres_13&fiddle=27435941cc97b7a239ec5b00fcde03da
@deg 。 . .我真的不知道你的评论是什么意思。这是修复 update
中的逻辑,而不是 CTE。以上是关于无法用左连接编写更新语句的主要内容,如果未能解决你的问题,请参考以下文章