關於SQLServer2005的學習筆記——臨時表、表變數和CTE
本文原本是為了說明遊標在某些特定環境下的用途,突然發現用來說明臨時表、表變數和CTE的關係更為合理一些。
本文的例子給了一串數字,是為了求得同組中所有數字的乘積,包括累計疊加等等,這樣的案例透過一般的分組方式很難辦到,而透過遊標更容易實現。
建立一個測試表
CREATE TABLE groups ( groupid VARCHAR(10), val INT NULL ) INSERT INTO groups VALUES ('a',2); INSERT INTO groups VALUES ('a',3); INSERT INTO groups VALUES ('a',1); INSERT INTO groups VALUES ('b',4); INSERT INTO groups VALUES ('b',6); INSERT INTO groups VALUES ('b',1); INSERT INTO groups VALUES ('c',10); INSERT INTO groups VALUES ('c',3); INSERT INTO groups VALUES ('d',7); |
透過臨時表和遊標的方法加以實現
CREATE TABLE #result (groupid VARCHAR(10),product BIGINT);
DECLARE @groupid VARCHAR(10),@prvgroupid VARCHAR(10),@val INT,@product BIGINT; DECLARE c CURSOR FAST_FORWARD FOR SELECT groupid,val FROM groups ORDER BY groupid; OPEN c; FETCH NEXT FROM c INTO @groupid,@val; SELECT @prvgroupid=@groupid,@product=1; WHILE @@fetch_status=0 BEGIN IF @groupid<>@prvgroupid BEGIN INSERT INTO #result VALUES(@prvgroupid,@product); SELECT @prvgroupid=@groupid,@product=1; END SET @product=@product*@val; FETCH NEXT FROM c INTO @groupid,@val; END IF @prvgroupid IS NOT NULL INSERT INTO #result VALUES(@prvgroupid,@product); CLOSE c; DEALLOCATE c; SELECT groupid,product FROM #result |
透過表變數和遊標的方式加以實現,從這裡看的話表變數和臨時表基本雷同
DECLARE @groupid VARCHAR(10),@prvgroupid VARCHAR(10),@val INT,@product BIGINT; DECLARE c CURSOR FAST_FORWARD FOR SELECT groupid,val FROM groups ORDER BY groupid; OPEN c; FETCH NEXT FROM c INTO @groupid,@val; SELECT @prvgroupid=@groupid,@product=1; WHILE @@fetch_status=0 BEGIN IF @groupid<>@prvgroupid BEGIN INSERT INTO #result VALUES(@prvgroupid,@product); SELECT @prvgroupid=@groupid,@product=1; END SET @product=@product*@val; FETCH NEXT FROM c INTO @groupid,@val; END IF @prvgroupid IS NOT NULL INSERT INTO #result VALUES(@prvgroupid,@product); CLOSE c; DEALLOCATE c; SELECT groupid,product FROM #result |
透過CTE的方式加以實現
WITH all_but_val AS ( SELECT a.groupid,a.val*b.val accum_val FROM groups a,groups b WHERE a.groupid=b.groupid and a.val>b.val ), but_val AS ( SELECT * FROM groups WHERE groupid IN (SELECT groupid FROM groups GROUP BY groupid HAVING COUNT(*)=1) ), all_val AS ( SELECT * FROM all_but_val UNION SELECT * FROM but_val ) SELECT groupid,max(accum_val) FROM all_val GROUP BY groupid |
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/6517/viewspace-629295/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Sqlserver 關於臨時表和表變數的總結SQLServer變數
- 再議臨時表和表變數變數
- 關於SQLServer2005的學習筆記——CTE遞迴和模擬測試資料SQLServer筆記遞迴
- SQL Server中的臨時表和表變數SQLServer變數
- 表變數和臨時表的差別 (以前把表變數叫成變數表了,哎。。。)變數
- SQLServer表變數和臨時表系列之概念篇SQLServer變數
- SQLServer臨時表和表變數系列之踢館篇SQLServer變數
- 關於SQLServer2005的學習筆記(一)——前言SQLServer筆記
- oracle臨時表空間學習筆記 增刪改查Oracle筆記
- mysql臨時表和記憶體表MySql記憶體
- mysql關於臨時表的總結MySql
- SQL Server中臨時表與表變數的區別SQLServer變數
- SQLSERVER 臨時表和表變數到底有什麼區別?SQLServer變數
- 記憶體表和臨時表的區別記憶體
- 關於SQLServer2005的學習筆記——生日問題SQLServer筆記
- 關於SQLServer2005的學習筆記——子查詢SQLServer筆記
- 關於SQLServer2005的學習筆記——分析函式SQLServer筆記函式
- 【基礎知識】基於事物的臨時表和基於會話的臨時表會話
- 關於SQLServer2005的學習筆記——XML的處理SQLServer筆記XML
- 關於with 臨時表 as的一些用法
- TempDB 中表變數和區域性臨時表的對比變數
- 關於SQLServer2005的學習筆記——樹形結構SQLServer筆記
- ORACLE臨時表和SQLSERVER臨時表異同OracleSQLServer
- 建立基於事務和基於會話的臨時表及臨時表建索引的實驗會話索引
- 【轉載】MySQL之臨時表和記憶體表MySql記憶體
- 關於 oracle 臨時表 ORA-14452Oracle
- 關於Oracle臨時表的使用的小經歷Oracle
- temp表學習筆記筆記
- 關於SQLServer2005的學習筆記——SQL查詢解析步驟SQLServer筆記
- oracle臨時表的經典學習資料Oracle
- hive學習筆記之三:內部表和外部表Hive筆記
- 關於SQLServer2005的學習筆記——自定義分組的實現SQLServer筆記
- sql server 儲存過程中使用變數表,臨時表的分析(續)SQLServer儲存過程變數
- 記憶體(memory)表和臨時(temporary)表之瞭解記憶體
- 關於SQLServer2005的學習筆記——異常捕獲及處理SQLServer筆記
- Oracle 基礎 ----臨時表和物件表Oracle物件
- CUUG 外部表學習筆記筆記
- 分割槽表學習筆記筆記