2016-09-19 50 views
0

我有一個WITH語句收集我想要的數據。我想要做的是能夠從我的WITHINSERT的不同部分執行SELECT,從而生成目標表。WITH語句後無法刪除表格

這裏是我長的查詢的簡化版本:

WITH Active AS (
    --SELECT 1 
), 
Inactive AS (
    --SELECT 2 
), 
Churn AS (
    --SELECT 3 
) 
--Drop destination table if exists 
IF OBJECT_ID('DestinationTable', 'u') IS NOT NULL DROP TABLE DestinationTable; 

SELECT Active.Name, Inactive.Name,Churn.Id 
INTO DestinationTable 
FROM Active a 
JOIN Inactive i ON a.Id = i.Id 
JOIN Churn c ON a.Id = c.Id; 

Sql Server的不直接在WITH後允許IF聲明。我不想在我的WITH之前移動IF,因爲那樣我的目的地表很可能會長時間爲空。

簡單的版本,我的問題的:

我怎麼能寫從WITH語句轉換成另一個表SELECT

+1

爲什麼不截斷你的DestinationTable而不是刪除它並重新創建它?會更簡單,資源更少。 –

+0

這聽起來像你正試圖維護長期查詢中「最近」的緩存結果以供其他地方使用。您可以在「DestinationTable」中添加一列以記錄每次運行「長查詢」時增加的序列號。完成後,刪除所有具有較低序列號的行。使用數據的代碼應該始終可以訪問由一個通用序列號標識的一個完整集。 (請注意您的應用程序需要的交易。) – HABO

回答

2

因爲它是強制使用與語句結果跟在一起的聲明。 除結果不允許外,其他語句。

你可以聲明上面寫的你降聲明

+0

因此,我應該只將結果寫入臨時表中? – Disasterkid

+0

用 –

+0

寫下上面我不想在我的WITH之前移動IF,因爲那樣很可能我的目標表很長一段時間是空的。 – Disasterkid

2

就重組這樣的:

--Drop destination table if exists 
IF OBJECT_ID('DestinationTable', 'u') IS NOT NULL DROP TABLE DestinationTable 

;WITH Active AS (
    --SELECT 1 
), 
Inactive AS (
    --SELECT 2 
), 
Churn AS (
    --SELECT 3 
) 

SELECT Active.Name, Inactive.Name,Churn.Id 
INTO DestinationTable 
FROM Active a 
JOIN Inactive i ON a.Id = i.Id 
JOIN Churn c ON a.Id = c.Id; 

的CTE的範圍意味着它需要在它的聲明後的聲明中使用。

否則,在替換目標表之前,您需要一些其他臨時區域來處理負載。

+0

但是這會不會在'WITH'正在運行時讓'DestinationTable'不可用? – Disasterkid

+0

不只是空的,它不會存在。您可以先創建它,而不是使用INTO。 –

+0

是的,通過「不可用」,我的意思是不存在。所以你認爲如果不是用'WITH',而是爲每個表創建臨時表並最終刪除它們會更好?這樣我可以使用'IF OBJECT_ID'而沒有問題。 – Disasterkid