SQL - CTE 与 VIEW

SQL - CTE vs VIEW

我的问题是SQL中的CTEView有什么区别。我的意思是在哪种情况下我应该使用 CTE 而在哪种情况下我应该使用 View。我知道两者都是某种虚拟 table,但我无法区分它们的用途。

我发现了一个类似的问题 here 但它是关于性能的。

更新 1:

例如:我有一个充满交易的数据库(tbl_trade)。我需要 select 从 350 万记录中仅记录当前月份到当前时间打开的交易,然后处理数据(在虚拟 table 上使用不同的查询 - 这看起来像视图)。这里的问题是我想要一个 SUM 的 3-4 列,然后我需要 SUM 一些列并用结果创建一个虚拟列(看起来像 CTE)。

例如:tbl_trade 有列:profitbonusexpenses。 我需要 SUM(profit)SUM(bonus)SUM(expenses) 和一个新列 total,它将等于 SUM(profit)+SUM(bonus)+SUM(expenses) .

PS。重新运行 SUM 的查询不是一个选项,因为我已经有了结果。

提前致谢!

选择CTE的原因之一:如果你在做分层查询,使用CTEs。可以递归调用 CTE。不能递归调用视图。

计划优化器对两者的解释完全相同。这只是另一回事。

视图可以单独使用。它可以将复杂的语句封装成更简单的查询。

例如,在 procedures/views 中,CTE 主要用于编写具有较少冗余的更清晰的代码。您也可以使用 CTE 进行递归查询,这是一个非常强大的功能!

我希望这有助于澄清事情。

视图可以编入索引,但 CTE 不能。所以这是重要的一点。

CTE 在 tree hierarchy 方面表现出色,即递归

此外,在处理复杂查询时请考虑视图。视图是数据库上的物理对象(但不物理存储数据),可用于多个查询,从而提供灵活性和集中式方法。另一方面,CTE 是临时的,将在使用时创建;这就是为什么它们被称为 inline view.

更新

根据您更新的问题,视图将是正确的选择。在 CTE 中处理 350 万行会在 TempDb 上产生额外开销,最终会降低 SQL 服务器性能。请记住,CTE 是一次性视图,因此不会存储任何统计信息,您也无法创建索引。它就像一个子查询。

CTE 仅在查询 运行ning 时存在于内存中。查询为运行后,CTE被丢弃;它不能用于下一个 SQL 查询,除非我们再次定义它。尽管如此,同一个 CTE 可能会在主查询和任何子查询中被多次引用。

视图是一个存储的 SQL 查询,每次您在另一个查询中引用它时都会执行该查询。请注意,视图不存储特定查询的输出——它存储查询本身。

关于 SQL 视图要记住的关键是,与 CTE 不同,视图是数据库中的物理对象,存储在磁盘上。但是,视图仅存储查询,而不存储查询返回的数据。每次您在查询中引用视图时都会计算数据。

再补充一个注意事项:权限。

  • 创建和使用视图需要 CREATE 权限,您可能已被授予也可能未被授予。
  • 如果您已被授予权限,您可能会发现自己与其他具有类似权限并希望创建或更改具有相同名称的视图的人发生命名冲突。
  • 解决命名冲突的最简单方法是创建额外的模式(命名空间)

数据库管理员可能不会同情上述情况,因此您可能无法首先创建视图。

在这种情况下,您可以将 CTE 视为一次性视图,它不需要更多您已经拥有的权限来 运行 SELECT 查询。

我经常使用 CTE 来创建自包含且不需要额外维护的东西,尤其是示例代码。