加入收藏 | 设为首页 | 会员中心 | 我要投稿 厦门站长网 (https://www.0592zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MsSql教程 > 正文

sql-server – SQL Server 2005中CTE的范围

发布时间:2021-02-20 10:47:45 所属栏目:MsSql教程 来源:网络整理
导读:WITH emp_CTE AS ( SELECT ROW_NUMBER() OVER(ORDER BY (SELECT 1)) AS IdentityId,* FROM dbo.employee )SELECT * FROM emp_CTE 这很好用 如果相同的查询是这样写的. WITH emp_CTE AS ( SELECT ROW_NUMBER() OVER(ORDER BY (SELECT 1)) AS IdentityId,* F

WITH emp_CTE AS (
    SELECT ROW_NUMBER() OVER(ORDER BY (SELECT 1)) AS IdentityId,*
    FROM dbo.employee )
SELECT * FROM emp_CTE

这很好用

如果相同的查询是这样写的.

WITH emp_CTE AS (
    SELECT ROW_NUMBER() OVER(ORDER BY (SELECT 1)) AS IdentityId,*
    FROM dbo.employee )
SELECT * FROM EMPLOYEES    
SELECT * FROM emp_CTE

它给出了一条告诉emp_CTE不存在的消息.

我们有什么方法可以解决这个问题吗?

谢谢
王子

解决方法

CTE仅是后续声明的一部分.

后续语句可以是单个SELECT / INSERT / UPDATE / DELETE,也可以是复合(带UNION,INTERSECT等)

例如:

;WITH cte1 AS
(
   select ...
),cte2 AS
(
    select ...
)
SELECT ...
UNION 
SELECT ...;

经验法则是范围直到下一个;将会.分号终止任何语句但不幸的是可选.

你上面的失败代码实际上就是这个

...;
WITH emp_CTE AS (
    SELECT ROW_NUMBER() OVER(ORDER BY (SELECT 1)) AS IdentityId,*
    FROM dbo.employee )
SELECT * FROM EMPLOYEES; 
SELECT * FROM emp_CTE;

所以CTE只是在……范围之内……员工;

(编辑:厦门站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读