无法用左连接编写更新语句

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&amp;fiddle=27435941cc97b7a239ec5b00fcde03da @deg 。 . .我真的不知道你的评论是什么意思。这是修复 update 中的逻辑,而不是 CTE。

以上是关于无法用左连接编写更新语句的主要内容,如果未能解决你的问题,请参考以下文章

sql 各种连接的使用条件,

左连接和右连接有啥区别

当我们在 select 中有 case 语句时,使用左外连接进行 Oracle 更新

替换更新左连接语句中的缺失值

左连接新认识

求助,SQlServer用外连接查询出未匹配的数据