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 BY
、INTO
...等指令,不過瑕不掩瑜,要等到在設計時期自己撞牆發現再修改就好了。