【问题标题】:Does SQL Server support the Oracle-like WITH clause?SQL Server 是否支持类似 Oracle 的 WITH 子句?
【发布时间】:2010-07-08 00:40:51
【问题描述】:

我已经看到这里多次提到 Oracle WITH 子句,用于给这样的子查询起别名:

WITH myData AS (SELECT id, text FROM SomeTable)
SELECT myData from SomeOtherTable

是否有任何版本的 SQL Server 支持此功能?如果没有,他们不这样做有什么特别的原因吗?表现?可能会出现错误使用?

【问题讨论】:

  • 顺便说一句,请注意,这与其说是“类 Oracle”,不如说是“类 ANSI-SQL”。
  • 真的吗?您是否知道我在哪里可以找到实际 ANSI-SQL 标准的副本?

标签: sql sql-server oracle tsql common-table-expression


【解决方案1】:

SQL Server 2005 及更高版本。

我想补充一点,您可以将这些堆叠起来效果很好:

WITH A AS (
    SELECT * FROM X
), B AS (
    SELECT * FROM A
), C AS (
    SELECT * FROM B
)
SELECT * FROM C

你甚至可以这样做:

WITH A AS (
), B AS (
)
SELECT * FROM A INNER JOIN B ON whatever

还要注意 WITH 必须是语句中的第一个关键字,所以你经常看到它写成:

;WITH A AS (
)

这基本上终止了前一条语句(分号在 T-SQL 中是一种可选的)

【讨论】:

    【解决方案2】:

    是的,SQL2005 和 SQL2008 都支持这个。他们被称为Common Table Expressions

    【讨论】:

    • ...和一个可爱的概念,在尝试掌握递归 CTE 时可以低头!
    • 是的,但实际上,一旦你写了几个,递归 CTE 并没有那么糟糕。它比替代品(例如它们)要好得多。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-26
    • 1970-01-01
    • 2011-08-18
    • 2011-09-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多