我正在编写一些带有多个子查询和许多连接的SQL查询,包括子查询内部和子查询的结果表。
我们没有使用视图,所以这是不可能的。
编写完之后,我正在查看它,并挠着头想知道它正在做什么,因为我无法跟随它。
您尝试使用哪种格式来清理此类混乱?缩进吗?
对于大型查询,我通常会大量依赖使用的命名结果集WITH。这样可以预先定义结果集,并使主查询更简单。命名结果集可以帮助提高查询计划的效率,例如postgres将结果集存储在临时表中。
WITH
例子:
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上运行