SQL筆記:不須預先宣告欄位的CTE暫存表

SQL的暫存表之一般資料表運算式(Common Table Expressions, CTE),他幾乎可以完美的取代@TempTable語法,理由是@TempTable這種語法需要進行預先欄位宣告,包含欄位名稱與型別,這個設定非常的惱人。而反觀CTE就沒有這種問題,盡管他表面上的正式語法也是需要預先宣告欄位名稱,但這種寫法是可以被略過、精簡掉的。

SQL暫存表(CTE)

一段CTE正式語法如下

WITH YourTempTableName(columnName1, columnName2 ...) AS
(
  SELECT
    *
  FROM
    AnotherTable
)

上面的語法其實已經比@TempTable還精簡一些了,但SQL允許我們變得更精簡:

WITH YourTempTableName AS
(
  SELECT
    *
  FROM
    AnotherTable
)

免宣告欄位名稱與型別,超爽是不是?

接著我們就可以用一般的SELECT或是其他SQL語法,針對CTE型態的資料表將其讀取回來:

SELECT
  *
FROM
  YourTempTableName

再說一次,比起那些成串令人嘔吐的花式SQL子查詢語法,是不是簡單好閱讀多了?同樣的,這種CTE依然只活在執行週期裡面,所以你不需要擔心垃圾、占用記憶體、釋放等問題。CTE最常被拿來用在SQL Select遞迴查詢,也就是單資料表生出CTE讓自己不斷join自己,形成一個超噁心的結果集,不過那是另外一個話題(SQL筆記:實作階層遞迴查詢(透過CTE暫存表))了。

CTE在使用上固然方便,但也有一些限制存在,例如無法進行ORDER BYINTO...等指令,不過瑕不掩瑜,要等到在設計時期自己撞牆發現再修改就好了。

相關參考

SQL Command Statement TempTable CTE InsertIntoSelect SelectIntoTempTable