您可以存储表以便在T-SQL语句中重用吗?

时间:2011-09-15 15:49:11

标签: sql sql-server

好的,我有这个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,或将另一个AND应用于{{ 1}}子句?

请注意,这只是我的SQL查询的一个示例,我现在有一个循环,因为它遍历所有时间块,(首先查询第一个结束后)。

基本上,有很多类似的SQL查询重复。如果我可以存储一次并操纵它,那就太棒了。

干杯,

3 个答案:

答案 0 :(得分:7)

使用SELECT INTO并将结果存储在临时表中(#前缀用于临时表)

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

然后你可以像任何其他物理存储的表一样引用#table,加入它等等。

答案 1 :(得分: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;

然后,您可以使用

#temp_table执行所有查询
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)

对于您要执行的每组日期。

答案 2 :(得分:0)

看看临时表(这里有大量信息和网络的其余部分)。

可以像普通表一样查询和插入它们。