【发布时间】:2017-09-26 08:46:03
【问题描述】:
用外行的话来说,WITH 子句和临时表之间的主要区别是什么?
在哪种情况下使用一种比另一种更好?
【问题讨论】:
-
关键区别:with 子句必须直接在关联查询中使用。使用临时表,您可以在会话期间使用它们。所以,它们的寿命是不同的。
标签: sql amazon-redshift data-warehouse temp-tables with-clause
用外行的话来说,WITH 子句和临时表之间的主要区别是什么?
在哪种情况下使用一种比另一种更好?
【问题讨论】:
标签: sql amazon-redshift data-warehouse temp-tables with-clause
主要区别在于临时表是存储表。 CTE 更类似于视图,并帮助您以更易于阅读、更合乎逻辑的方式表达您的 SQL。表格和视图之间存在相同的差异,因为表格可以让您以高效的方式做事。
如果您正在构建一个非常复杂的查询或需要分阶段构建的查询,WITH 子句/CTE 将帮助您做到这一点。但是,如果您希望将数据存储在表中以提高性能,那么临时表将是您的最佳选择。 同样,临时表可以反复使用,因此如果您在多个查询中使用相同的代码,您可能会考虑使用临时表而不是 CTE。
【讨论】:
WITH 子句通常在选择查询中使用,当您必须对包含复杂子句(例如 HAVING)的几个子查询执行一些连接时(尽管不一定)。一般来说WITH 子句只能用在SELECT 语句中。
但是在必须操作数据的情况下,这意味着您想在某些条件下更改数据,甚至想再次删除某些行,具体取决于您希望使用TEMP TABLE 的某些复杂条件。虽然大多数情况都可以通过WITH 实现,但它通常以一些复杂的逻辑为代价,但在TEMP 表中,您可以使用几个不同的 SQL 语句来实现相同的目标。
此外,TEMP 表通常用作临时表而不是 SELECT 查询的视图,即当您想要从 S3 加载大量数据时使用 TEMP 表,您可能想要加载将数据放入临时表,分析数据,去除冗余,最后一次性将其合并到原始表中。
虽然TEMP 表仅在当前会话中是临时的,但WITH 始终会重新评估。
【讨论】: