2012-09-21 231 views
0

可以使用select into與多個cte嗎?例如在下面的代碼中,將第一個cte ctable_table的結果插入到dbo.table1中,然後定義另一個cte。這可能嗎?可以使用select into與多個cte

WITH cte_table 
AS 
( 
SELECT * 
FROM dbo.table 
) 
INSERT INTO dbo.table1 
SELECT * 
FROM [cte_table] 
, cte_table2 
AS 
(
SELECT * 
FROM dbo.table2 
) 
+3

這真的沒有意義,你不這麼認爲嗎? –

+2

你究竟想爲你做什麼? – Vikdor

回答

3

如果您的案例是記錄集的Re-usability,那麼使用Temp Table或Table變量。

例如

Select * Into #temp1 From dbo.table 

INSERT INTO dbo.table1 
SELECT * FROM #temp1 

SELECT * FROM #temp1 ..... and do some other re-usability operations. 

一個鏈接CTE工作作爲下(只是一個例子)

;With Cte1 As (Select * from table1) 
,Cte2 As (Select * from table2) 

select c1.*,c2.* 
from cte1 c1, cte2 c2 

希望你瞭解什麼時候使用什麼和如何。

3

,你不行:你會得到一個錯誤INTO是不允許的,而且,正如其他人所指出的那樣,這是有道理的CTE旨在成爲一個可重複的(從而靜態)參考。

我還記得在sql執行時cte被分解到派生表中的地方,這是/大部分語法糖。

+0

更不用說'SELECT ... INTO'無論如何都不返回結果集。 –

+0

@Martin:絕對! – davek

0

不,您不能在CTE中使用select into。而且它實際上也沒有任何意義。

4

連鎖你所有的CTE,然後做select into。

WITH First_CTE AS 
(
    SELECT 
     Columns 
    FROM 
     Schema.Table 
    WHERE 
     Conditions 
), 
Second_CTE AS 
(
    SELECT 
     Columns 
    FROM 
     Schema.OtherTable 
    WHERE 
     Conditions 
) 

SELECT 
    Variables 
INTO 
    NewTable 
FROM 
    First_CTE A 
JOIN 
    Second_CTE B 
ON 
    A.MatchVar = B.MatchVar 

如果您以後不需要CTE,但比您的ETL中的子查詢更簡單,那麼這會很有幫助。