一尘不染

格式化清晰易读的SQL查询

sql

我正在编写一些带有多个子查询和许多连接的SQL查询,包括子查询内部和子查询的结果表。

我们没有使用视图,所以这是不可能的。

编写完之后,我正在查看它,并挠着头想知道它正在做什么,因为我无法跟随它。

您尝试使用哪种格式来清理此类混乱?缩进吗?


阅读 187

收藏
2021-03-17

共1个答案

一尘不染

对于大型查询,我通常会大量依赖使用的命名结果集WITH。这样可以预先定义结果集,并使主查询更简单。命名结果集可以帮助提高查询计划的效率,例如postgres将结果集存储在临时表中。

例子:

WITH 
  cubed_data AS (
     SELECT 
        dimension1_id,
        dimension2_id,
        dimension3_id,
        measure_id,
        SUM(value) value
     FROM
        source_data
     GROUP BY
        CUBE(dimension1, dimension2, dimension3),
        measure
  ), 
  dimension1_label AS(
     SELECT 
        dimension1_id,
        dimension1_label
     FROM 
        labels 
     WHERE 
        object = 'dimension1'
  ), ...
SELECT 
  *
FROM  
  cubed_data
  JOIN dimension1_label USING (dimension1_id)
  JOIN dimension2_label USING (dimension2_id)
  JOIN dimension3_label USING (dimension3_id)
  JOIN measure_label USING (measure_id)

该示例有些虚构,但我希望它可以显示与内联子查询相比,其清晰度有所提高。当我为OLAP准备数据时,命名结果集对我有很大的帮助。如果您有/想要创建递归查询,则也必须有命名结果集。

WITH 至少可以在最新版本的Postgres,Oracle和SQL Server上运行

2021-03-17