關於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變數
- mysql關於臨時表的總結MySql
- SQLSERVER 臨時表和表變數到底有什麼區別?SQLServer變數
- 關於with 臨時表 as的一些用法
- hive學習筆記之三:內部表和外部表Hive筆記
- Python學習筆記 - 變數Python筆記變數
- oracle臨時表空間相關Oracle
- Tensorflow學習筆記: 變數及共享變數筆記變數
- 關於http(自己的學習筆記)HTTP筆記
- Myth 關於Git的學習筆記Git筆記
- javascript學習筆記,二、變數JavaScript筆記變數
- 關於VBxxDATA單元內表記錄的變化
- 今天來學習一下MySQl的 臨時表,變數,行轉列,預處理的一些相關技術的使用!MySql變數
- php 學習筆記之關於時區的那點事PHP筆記
- MySQL臨時表MySql
- PostgreSQL:臨時表SQL
- mysql修改表欄位學習筆記MySql筆記
- Flutter學習筆記(13)--表單元件Flutter筆記元件
- oracle 臨時表的使用Oracle
- SQLServer臨時表的使用SQLServer
- MySQL 中的臨時表MySql
- MySQL-37:記憶體臨時表MySql記憶體
- [go 學習筆記] 二、變數、常量Go筆記變數
- 12C關於CDB、PDB 臨時temp表空間的總結
- MySQL之臨時表MySql
- mysql 建立臨時表MySql
- hive學習筆記之四:分割槽表Hive筆記
- mysql臨時表,臨時表空間,ibtmp1表空間暴增原因初探MySql
- TensorFlow常量、變數和佔位符詳解(學習筆記)變數筆記
- Python 學習筆記-2-1-變數Python筆記變數
- Nginx變數詳解(學習筆記十九)Nginx變數筆記
- C語言學習筆記之變數C語言筆記變數
- MySQL 5.7 新特性 共享臨時表空間及臨時表改進MySql
- 變數的分類(臨時(本地)變數、環境變數、全域性變數和系統變數)變數
- <react學習筆記(9)>表單控制元件React筆記控制元件
- 資料庫學習筆記之查詢表資料庫筆記
- 臨時筆記11筆記
- Oracle臨時表空間檢視、新增臨時表空間資料檔案、修改預設臨時表空間 方法!Oracle
- ORACLE臨時表總結Oracle