WITH子句和临时表有什么区别?

6

通俗易懂地讲,WITH子句和临时表之间的关键区别是什么?

在哪种情况下使用其中一种比另一种更好?


关键区别:with 子句必须直接在相关查询中使用。使用临时表时,您可以在会话期间使用它们。因此,它们的生命周期不同。 - Renato Afonso
2个回答

6

WITH子句通常在选择查询中使用,特别是当您需要对包含复杂子句(如HAVING)的多个子查询执行某些连接时。一般来说,WITH子句只能在SELECT语句中使用。

但是,在需要操作数据的情况下,也就是说,您想根据某些复杂条件更改数据甚至想再次删除某些行,您可能更愿意使用TEMP TABLE。虽然大多数情况都可以通过WITH实现,但这通常需要一些复杂的逻辑,在TEMP表中,您可以有几个不同的SQL语句来实现相同的效果。

此外,TEMP表通常用作暂存表而不是用于SELECT查询的视图,也就是说,当您想从S3加载大量数据时,您可能需要将数据加载到临时表中,分析数据,去除冗余信息,最后一次性合并到原始表中。

虽然TEMP表仅对当前会话是短暂的,但WITH总是重新评估。


1
主要的区别在于,临时表是一个存储表,公共表表达更像是视图,它可以帮助您以更易读、更合乎逻辑的方式表达 SQL。同样的差异也存在于表和视图之间,即表能够潜在地以高效的方式完成某些操作。
如果您正在构建非常复杂的查询或需要分步构建查询,则 WITH 子句/CTE 将有助于实现这一目标。然而,如果您想将数据存储在表中以提高性能,则临时表将是最好的选择。同样地,临时表可以被反复使用,因此如果您在多个查询中使用相同的代码,您可能会考虑使用临时表而不是 CTE。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接