如何在SQL Server 2008 R2中基于临时表提取其他表数据?
在SQL Server 2008 R2中用临时表提取数据的实现方案
看了你的需求和现有查询,核心是把TABLEA和TABLEB的联合结果作为中间集,再基于它计算每个FILEKEY的最大有效日期,最后关联主表得到结果。用临时表可以把这个中间逻辑拆解开,让查询更清晰,也方便调试中间数据,下面是具体的实现步骤:
1. 先把TABLEA和TABLEB的联合结果存入临时表
我们可以用SELECT INTO快速创建临时表并填充数据,不用手动定义字段类型,非常省心:
-- 创建临时表#TempC,存储TABLEA和TABLEB的联合数据 SELECT FILEKEY, STATUS, EFFDATE INTO #TempC FROM ( SELECT B.FILEKEY, B.STATUS, B.EFFDATE FROM TABLEB B UNION SELECT A.FILEKEY, A.STATUS2 AS STATUS, A.EFFDATE2 AS EFFDATE FROM TABLEA A ) AS C;
这里的UNION会自动去重,如果你的业务场景不需要去重,换成UNION ALL性能会更好。
2. 基于临时表计算每个FILEKEY的最大有效日期
接下来针对临时表#TempC,筛选出日期不超过2011-05-01的记录,按FILEKEY分组取最大的EFFDATE,结果存入另一个临时表:
-- 创建临时表存储每个FILEKEY的最大有效日期 SELECT FILEKEY, MAX(EFFDATE) AS Max_EffDate INTO #TempMaxDate FROM #TempC WHERE EFFDATE <= '2011-05-01' -- 建议用YYYY-MM-DD标准日期格式,避免地区格式歧义 GROUP BY FILEKEY;
如果你的数据量较大,可以给#TempC加个索引来提速:
-- 给临时表创建索引,优化分组查询性能 CREATE NONCLUSTERED INDEX IX_TempC_FileKey_EffDate ON #TempC(FILEKEY, EFFDATE);
3. 关联主表获取最终结果
最后把TABLE1、TABLE2和临时表#TempMaxDate关联起来,得到你需要的字段:
-- 关联主表与临时表,输出最终结果 SELECT A.FILEKEY, T.Max_EffDate, A.STATUS FROM TABLE1 A INNER JOIN TABLE2 B ON A.FILEKEY = B.FILEKEY LEFT JOIN #TempMaxDate T ON A.FILEKEY = T.FILEKEY -- 用LEFT JOIN防止FILEKEY无匹配时丢失数据 GROUP BY A.FILEKEY, A.STATUS, T.Max_EffDate;
注意这里要把T.Max_EffDate加入GROUP BY,因为SELECT里包含了这个非聚合字段,SQL Server要求必须在GROUP BY里声明。
清理临时表(可选)
SQL Server的临时表会在会话结束后自动删除,如果你想在查询结束后手动清理,可以用适配2008 R2的语法:
-- 手动删除临时表 IF OBJECT_ID('tempdb..#TempC') IS NOT NULL DROP TABLE #TempC; IF OBJECT_ID('tempdb..#TempMaxDate') IS NOT NULL DROP TABLE #TempMaxDate;
你提到的联合表C的示例数据:
TABLEA与TABLEB联合生成的表C结果如下:
FILEKEY STATUS EFFDATE1 0 2009-01-01 00:00...
用上面的临时表方案,完全可以覆盖这个中间结果的处理逻辑,而且比嵌套子查询更易读和维护。
内容的提问来源于stack exchange,提问作者Green
相关产品推荐
相关产品推荐

