有没有一种方法可以在不使用CTE的情况下进行递归SQL查询?

时间:2020-08-11 13:50:56

标签: sql sql-server

我想使用从以下CTE获得的结果作为select语句,以便将其嵌套在另一个查询中-据我了解,您不能使用嵌套在查询中的CTE;

WITH cte_exp AS
(
    select
        [PrimaryKey],
        [SelfKey]
    from
        MyTable
    where PrimaryKey = 1

    UNION ALL

    select
        i.[PrimaryKey],
        i.[SelfKey]
    from
        MyTable i
        inner join cte_exp cte
            on cte.PrimaryKey = i.SelfKey
)
SELECT 'AAA' AS StandardEntry, [PrimaryKey]
FROM   cte_exp

从MyTable-

PrimaryKey | SelfKey
--------------------
     1         null
     2           1
     3         null
     4           2
     5           4
     6           3
     7           2

会产生:

StandardEntry | PrimaryKey
--------------------------
    AAA            1
    AAA            2
    AAA            4
    AAA            7
    AAA            5

但是我希望能够利用此表格输出并将其插入到另一个预先存在的表中,例如:

INSERT INTO AnotherTable ([StandardEntry],[Key]) select * from  ( ... the cte as above ... ) 

我是否需要将其创建为存储过程,或者有什么方法可以包装CTE

观点不好;在CTE之外使用PrimaryKey选择器where PrimaryKey = 1仅导致一行而不是预期的5行,因此该变量需要在第一条select语句中注入)

2 个答案:

答案 0 :(得分:6)

您不是嵌套 CTE,但它们可以成为insert的一部分:

with cte as (
      . . . 
     )
insert into . . .
   select . . .
   from cte;

您可以在insert的语法图中看到它。

请注意,在大多数数据库中,CTE是select的一部分,因此您可以做自己想做的事情。

答案 1 :(得分:0)

如果您想查询多个级别的数据而无需递归,那么我建议您调查一下hierarchyid数据类型。