查询中的视图引用是否正确称为“派生表”?

Eri*_*ikE 5 sql-standard

回答有关 stackoverflow 的问题时,我提出了派生表的定义:

派生表是一个完整的查询,在括号内,就像一个真正的表一样使用。

但有评论者反对:

尽管除了“括号内”之外还有其他类型的派生表。... [例如] 视图和表值函数 ... .

并进一步支持这一点:

来自 ISO/IEC 2003 规范,框架卷的第 4.3 节,2003 年 8 月规范草案的第 13 页:“引用零个或多个基表并返回表的操作称为查询。查询的结果称为一个派生表。” 请注意,视图和表值函数都返回“查询结果”,这是一个派生表。Microsoft(以及在较小程度上,Oracle)因其在其文档中错误地将“派生表”和“子查询”等同而臭名昭著,但派生表确实也包括预定义的查询,如视图。

那么真正的独家新闻是什么?我是将我认为的派生表降级为简单的“FROM 子句别名内联子查询”还是视图没有正确派生表

请注意:我在网上搜索了很长一段时间,但找不到任何明确的内容。我没有上述规范的副本。

此外,我认为值得解决其他问题。假设视图被正确地称为“派生表”。这是否使对视图的引用也是“派生表”或仅仅是引用?对于一个 CTE 的例子,应该把这个点带回家:

WITH SalesTotals AS (
   SELECT
      O.CustomerID,
      SalesTotal = Sum(OrderTotal)
   FROM
      dbo.CustomerOrder O
   GROUP BY
      O.CustomerID
)
SELECT
   C.Name,
   S.SalesTotal
FROM
   dbo.Customer C
   INNER JOIN SalesTotals S
      ON C.CustomerID = S.CustomerID;
Run Code Online (Sandbox Code Playgroud)

SalesTotals引入的CTEWITH是一个派生表。但INNER JOIN SalesTotals 也是派生表,还是只是对派生表的引用?这个查询有两个派生表还是一个?如果一个人,然后推而广之,我认为,一个观点可能是一个派生表,但参考它可能不具备成为一个派生表。

swa*_*eck 3

从 SQL Server 的角度来看,表表达式命名查询。命名查询的概念似乎与@a_horse_with_no_name之前评论的一致。表表达式有四种类型:

  • 派生表
  • 通用表表达式
  • 意见
  • 内联表值函数

派生是返回整个表结果的子查询。CTE类似于派生表,但通常被认为更具可读性和模块化它还具有递归功能。视图是一个可重用的命名查询其中存储了表表达式的定义。视图和内联表值函数之间的主要区别在于后者采用参数而前者不采用参数。

这是根据 Ben-Gan 等人《查询 Microsoft SQL Server 2012》第 4 章中有关表表达式的讨论编写的。