2011-09-15 44 views
2

好了,所以我有這個T-SQL語句:你可以存儲表在T-SQL語句中重用嗎?

SELECT 
    COUNT(DISTINCT RentalNo) as Count 
FROM 
    RoomRental AS rr 
    LEFT JOIN 
     RoomLinks AS r 
     On (r.RoomNo1 = rr.RoomNo OR r.RoomNo2 = rr.RoomNo) 
     AND r.CostCentreNo = rr.CostCentreNo 
WHERE Cancelled = 0 
    AND (rr.RoomNo = @RN OR r.RoomNo2 = @RN OR r.RoomNo1 = @RN) 
    AND rr.CostCentreNo = @CCN 
    AND StartDate = @StartDate 
    AND DATEADD(minute,0-SetupTime,StartTime) < @EndBlock 
    AND DATEADD(minute,BreakdownTime,EndTime) > @StartBlock) 

有什麼辦法,我可以存儲SELECT *,它,然後迅速(無需再次申請的聲明),得到RentalNos,或申請其他ANDWHERE子句?

注意,這只是我的SQL查詢的例子,我現在有一個環繞來繞去,因爲它通過所有的時間塊,(後首先查詢第一結束)。

基本上,有很多類似的SQL查詢重複。如果我可以存儲一次並操作它,那將會很棒。

乾杯,

保羅

+0

請添加你試圖存儲這個sql的輸出。 – Ankur

+0

根據您在查詢中存儲表的含義,您可能需要[公用表表達式(CTE)](http://msdn.microsoft.com/zh-cn/library/ms175972.aspx)。 – onedaywhen

回答

7

使用SELECT INTO並存儲在臨時表中的結果(#前綴用於臨時表)

SELECT yourcols, ... 
INTO #table 
FROM yourtables... 

然後,你可以參考#table像任何其他物理存儲的表,連接到這裏,等

+2

+1只是一個補充 - 一個臨時表的生命週期會持續到當前登錄會話終止或語句批量完成,除非您先對其執行「DROP TABLE」。 –

+2

這不適用於OP要求的內容。他們正在討論任意追溯改變'WHERE'或'SELECT'子句。這當然是不可能的。 –

+1

爲什麼不呢?查詢#table時,他可以添加額外的謂詞。 –

2

您可以通過執行創建臨時表中的以下

SELECT * 
    INTO #temp_table 
    FROM etc. 

或者具體地說,

SELECT * 
    INTO #temp_table 
    FROM RoomRental AS rr LEFT JOIN RoomLinks AS r 
    ON (r.RoomNo1 = rr.RoomNo OR r.RoomNo2 = rr.RoomNo) 
    AND r.CostCentreNo = rr.CostCentreNo 
WHERE Cancelled = 0 
    AND (rr.RoomNo = @RN OR r.RoomNo2 = @RN OR r.RoomNo1 = @RN) 
    AND rr.CostCentreNo = @CCN; 

然後,你可以通過使用

SELECT COUNT(DISTINCT RentalNo) as Count 
    FROM #temp_table 
WHERE StartDate = @StartDate    
    AND DATEADD(minute,0-SetupTime,StartTime) < @EndBlock 
    AND DATEADD(minute,BreakdownTime,EndTime) > @StartBlock) 

爲每一組要做到的日期執行你對#temp_table所有查詢。

+0

嘿,謝謝你如何實現我想要的:)的確切說明! – Doomsknight

+0

是的,我從來沒有足夠的代表在當時upvote:p。 – Doomsknight

0

看一看臨時表(大量的信息對這裏併網的其餘部分)。

它們可以查詢和插入就像一個正常的表。

相關問題