MySQL中能否删除公用表表达式(CTE)的列或调整列顺序?
实现列顺序调整的两种方案
方案1:调整查询结果的列顺序(最推荐,全数据库通用)
你现在用select *的写法会先输出cte3的所有原生字段,之后才拼接你新增的两个计算字段,所以duration会出现在percent_monthly_changes前面。只要手动列明所有需要的字段,按你想要的顺序排列即可,不用修改物理表结构,没有语法兼容问题:
select -- 按你需要的顺序罗列cte3里除了duration之外的字段,示例如下,根据你实际字段调整 film_title, period_month, plays_, monthly_changes, -- 先放计算出来的percent_monthly_changes round(monthly_changes/lag(plays_,1) over (partition by film_title order by period_month)*100,2) as percent_monthly_changes, -- 再放duration字段 duration, -- 最后放累加时长字段 sum(duration) over(partition by film_title order by period_month) as accum_duration from cte3;
方案2:调整物理表的永久列顺序
如果需要修改物理表的字段存储顺序,语法和支持程度取决于你用的数据库类型:
- 如果你用的是MySQL:支持ALTER TABLE调整顺序,注意需要完整填写duration字段的原有类型和属性(比如是否非空、默认值等,漏写会覆盖原有属性导致报错),示例语法:
ALTER TABLE 你的表名 MODIFY COLUMN duration 原有字段类型 [原有属性,比如NOT NULL DEFAULT 0] AFTER percent_monthly_changes; - 如果你用的是PostgreSQL、Oracle、SQL Server:这类数据库本身不支持调整已有列的物理顺序,官方设计中列顺序不影响数据使用,非要调整的话只能新建一张按你想要的顺序排列字段的新表,导入旧表数据后删除旧表、重命名新表,操作成本很高,非必要不建议操作。
补充说明:SQL标准没有强制要求列的存储顺序,正常查询、计算时列的先后完全不影响结果,除非有固定格式导出、对接下游系统的特殊要求,否则不需要修改物理表结构,查询时指定字段顺序即可满足需求。
内容的提问来源于stack exchange,提问作者dgrszombie315
相关产品推荐
相关产品推荐

