使用“with as”输出几次

时间:2011-03-17 23:28:06

标签: sql sql-server sql-server-2005

我不能使用

中的t
with t as (
        select row_number() OVER (partition by ID ORDER BY id) as numb, * 
        from my_table
        where id= 6
    )

select top 2 from t # it works
select top 2 from t # here I get error Invalid object name 't'.

是否有任何提示使用时间超过时间?

3 个答案:

答案 0 :(得分:4)

你不能这样做。 CTE只能在一个语句中使用(尽管您可以在一个语句中多次使用它。

看看this article。 SNIPPIT:

  

一旦定义了CTE,它就可以   由第一个引用多次   跟随它的查询。

来自their documentation

  

公用表表达式(CTE)可以   被认为是临时结果集   这是在执行中定义的   单个SELECT,INSERT的范围,   更新,删除或创建视图   言。

强调“单个SELECT,INSERT,UPDATE,DELETE或CREATE VIEW语句的范围。”

答案 1 :(得分:1)

  

是否有任何提示使用时间超过时间?

当然,如果您在存储过程中执行此操作,只需将其转储到#temp表中即可。在存储过程结束时,#temp表消失。

with t as (
        select row_number() OVER (partition by ID ORDER BY id) as numb, * 
        from my_table
        where id= 6
    )
select * into #tmp from t

select top 2 from #tmp -- good
select top 2 from #tmp -- good also

在SP之外,只需确保在尝试再次创建#table之前删除#table,否则下一个select ..into #name会因#name already exists错误而退出

答案 2 :(得分:0)

您只能在CTE后面的单个查询中使用CTE。但是,您可以根据需要使后面的查询变得复杂。

在您的示例中,您可能会考虑两个选择之间的联合,具体取决于您想要的内容。您提供的代码不够具有描述性,无法建议任何其他变体。