2017-10-04 166 views
0

因此,我創建了一個基本運行由多個易失性表構建的DML語句的報表。我建立它的方式是,我的每個臨時表基本上都是從先前的表中派生出來的。例如,在我的第一張表中,我定義了'數據集',而其他臨時表定義了我的「排除」,然後我最後一對臨時表將它組合起來,然後在最終查詢中執行它。使用多個臨時表創建存儲過程

我想自動執行此報表來每天提取數據,但我不確定是否爲其創建宏或sp。兩種方法都存在的更大問題是,我怎麼能夠有效利用每個臨時表?我想過把我所有的表格合併成一個GIANT(1000+行)的DML語句,但是肯定的,那裏肯定有更好,更簡單的選項。

任何幫助深表謝意,謝謝!

+0

由於您提到了每日數據拉取,因此您可能不需要臨時表。您可能可以使用登臺表。這些是普通數據庫表,它們不是規範化或星型模式的一部分。他們的目的是幫助ETL過程的T部分。不要一直創建臨時表,只需更換臨時表的內容即可。 –

+0

另一種選擇是使用全局臨時表。它們在訪問時被實例化,是會話本地的,並且在用戶TEMP空間而不是SPOOL中實現。表定義保留在數據字典中,因此您不必將它們嵌入到整個SQL中以構建報表。 –

回答

0

另外,您可以使用Common Table Expression (CTE),而不是臨時表:

WITH cte1 AS 
( 
    SELECT * 
    FROM table_1 
    WHERE 
), cte2 AS 
(
    SELECT... 
    FROM cte2 
    JOIN ... 
    WHERE 
) 
... 
SELECT * 
FROM cte_n; 

一個CTE可以依賴於前一個或沒有,你也可以使用遞歸和最終的查詢結果相結合。

+0

經過多次測試,我發現CTE是最適用的。從創建它的視圖然而,當,我不知道語法是什麼,下面的代碼: CREATE遞歸視圖db.Test_View AS WITH CTE AS 3 ( 選擇 FROM CTE 2 ), CTE 2 AS ( 選擇 FROM CTE 1 加入... WHERE ... ), CTE 1 AS ( 選擇 FROM ... JOIN ON ... WHERE ... ) SELECT*從CTE3開始 – WhimsicalWhale