使用 CTE 替代子查询

未匹配的标注

避免使用子查询, CTE 可以让你的查询更加容易阅读。

总是使用新行填充一个 CTE 查询块。

总是在你的 CTE 中命名一个 final ,并在最后 select * from final。这样当你需要调试结果的时候,可以非常方便的检查查询中使用的其他 CTE 的输出。

CTE 的闭合括号需要和 with 语句以及 CTE 命名保持同一级别缩进。

-- Good
with ordered_details as (

    select
        user_id,
        name,
        row_number() over (partition by user_id order by date_updated desc) as details_rank
    from billingdaddy.billing_stored_details

),

final as (

    select user_id, name
    from ordered_details
    where details_rank = 1

)

select * from final

-- Bad
select user_id, name
from (
    select
        user_id,
        name,
        row_number() over (partition by user_id order by date_updated desc) as details_rank
    from billingdaddy.billing_stored_details
) ranked
where details_rank = 1

注:CTE (Common Table Expressions 通用表表达式)在 Postgres、Oracle、MSSQL 以及 MySQL 8.0 以上版本获得支持。

本文章首发在 LearnKu.com 网站上。

上一篇 下一篇
讨论数量: 0
发起讨论 只看当前版本


暂无话题~