【问题标题】:Wondering the difference between 'with' and 'view' in SQL想知道 SQL 中 'with' 和 'view' 的区别
【发布时间】:2014-03-31 17:19:06
【问题描述】:

所以我相信在 SQL 中,如果我想临时创建一个新表并用于进行一些查询,我可以使用 CREATE VIEW 来创建一个没有物理数据但可用于查询的“虚拟表”,并且是总是更新。

VS

SQL WITH 子句也允许您为子查询块命名?

如果有人可以向我解释这些差异,将不胜感激,谢谢!

【问题讨论】:

  • 你可以用WITH 做而你不能用其他对象(视图、表)做的事情是在一个语句中执行递归函数。即,如果您有一个像员工组织结构或其他东西一样递归引用自身的表,您可以编写一个递归 CTE,该 CTE 一直沿着链向下走。 technet.microsoft.com/en-us/library/ms186243(v=sql.105).aspx@Erwin 已经提出了这一点,但我认为值得强调。
  • 如果您告诉我们您使用的是哪个 DBMS 也可能会有所帮助

标签: sql view common-table-expression temp-tables


【解决方案1】:

view 是一个持久化的SELECT 查询,任何对基础表具有访问权和特权的用户都可以调用它。只是查询被持久化(配方),而不是结果。你可以从它SELECT,就像你从一张桌子SELECT。根据您的 RDBMS,您可以存储其他属性并调节访问权限。
在某些 RDBMS 中,甚至实现了对视图的写操作,这些操作被转发到底层表。

CTE(通用表表达式,又名“WITH 子句”)类似于视图,但仅对附加到它的查询可见,而不是持久化。各种RDBMS的实现存在差异。
subquery 不同,CTE 可以独立地在多个查询级别上重复使用。

临时表是完全不同的东西。这是一个带有自己数据的实际表,只是在会话结束时(或有时在事务结束时)不会持久化和丢失。

【讨论】:

  • 那么 VIEW 是子查询,而 WITH 是 CTE?这意味着在 CTE 更像是一次性使用交易的情况下,可以轻松地重复使用 VIEW?
  • @user3290443:是的,除了subquery 根本不是视图。通常它是一个嵌套的SELECT 语句,是更大查询的一部分。我添加了一些指向 Wikipedia 定义的链接,因为您的实际 RDBMS 是未知的。
【解决方案2】:

如果你想创建一个临时表,只需创建一个临时表并在完成后将其删除

CREATE TABLE #MyTable (Id INT) -- Add whatever other columns you need
-- Populate the table as needed
-- Run some queries
DROP TABLE @MyTable

视图用于非规范化数据以方便查询(通常,不是临时方式)。 SQL WITH 子句用于将子查询用作较大查询的一部分,并且子查询在较大查询之外不可用。它们之间的主要区别在于可用性范围(视图持久性与子查询是临时性的),以及视图附加功能的存在(例如安全性、约束等)

【讨论】:

    猜你喜欢
    • 2012-05-27
    • 1970-01-01
    • 1970-01-01
    • 2016-01-20
    • 1970-01-01
    • 1970-01-01
    • 2017-08-13
    • 2020-02-14
    • 1970-01-01
    相关资源
    最近更新 更多