【发布时间】:2012-05-27 08:01:29
【问题描述】:
这里的任何人都可以告诉我 VIEW 和 WITH 的区别,因为我搜索了很多地方,但我找不到任何关于它的信息。
我的想法是 VIEW 和 WITH 是相同的,除了 VIEWs 被保存为 Schema-object,但我可能是错的
【问题讨论】:
-
WITH CTE vs View的可能重复
这里的任何人都可以告诉我 VIEW 和 WITH 的区别,因为我搜索了很多地方,但我找不到任何关于它的信息。
我的想法是 VIEW 和 WITH 是相同的,除了 VIEWs 被保存为 Schema-object,但我可能是错的
【问题讨论】:
SQL 视图和 with 子句非常相似。以下是一些差异。
视图在数据库中创建一个具有相关元数据和安全功能的实际对象。 With 语句只是单个查询的一部分。
在许多数据库中,视图都有选项,例如,对它们进行索引或“实例化”它们。
With 语句在某些数据库中提供了使用递归 CTE 的机会。这对于视图是不可能的。
对于合并到查询中的简单子查询,它们非常相似。选择实际上取决于您是要创建可重用的代码(视图)还是专注于单个查询(with)。
【讨论】:
从根本上说,视图的定义保存在数据库中,可以被任何查询重用,而 WITH 子句(或通用表表达式,或 CTE)与一个特定的查询相关联,只能通过复制来重用。
否则,它们将基本相同。
如果您使用递归 WITH 子句,那么您无法在 VIEW 中获得相同的结果,除非视图定义本身使用 WITH 子句(这是合法的)。
【讨论】:
简而言之,WITH 是 DML 中使用的子句,VIEW 是数据库对象。视图定义可能包含使用WITH 的查询。您可以将WITH 视为派生表(在 Microsoft 术语中)或内联视图(在 Oracle 中)的变体,它在主 DML 之前定义并且能够引用自身(递归查询)
WITH 也用于 SQLServer 中的不同上下文(查询提示)。
【讨论】: