使用 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 以上版本获得支持。