隨著 Query變複雜,就會需要多層的結構來產生結果,以下示範可能的情境,以及如何用 With來優化
1. 巢狀 Query
傳統上如果需要進行複雜的 Query,會寫成Sub-Query的形式,例如下列
SELECT
...
FROM(
SELECT
...
FROM
A
)
隨著層數的增加,理解也會困難,要一層一層記住運算結果也會非常困難,因此可以使用別名方便記憶
SELECT
...
FROM(
SELECT
...
FROM
A
) AS number_of_users
LEFT JOIN(
SELECT
...
FROM
B
) AS number_of_videos
ON
number_of_users.user_id = number_of_videos.user_id
可是看起來就是很討厭阿!一大沱東西
2. 為何要使用 With
不然我就掰不下去了(誤)
使用 With可以把每一個 sub-query用類似物件的方式包裝起來,舉個例子
WITH number_of_users AS (
SELECT
...
FROM
A
),
number_of_videos AS (
SELECT
...
FROM
B
)
SELECT
...
FROM
number_of_users
LEFT JOIN
number_of_videos
ON
number_of_users.user_id = number_of_videos.user_id
在最下面的 Query我們只要理解 number_of_users
和 number_of_videos
是用 user_id
Join起來,至於 number_of_users
和 number_of_videos
是怎麼運算出來的,I don’t fucking care,想知道的話再往上找即可。
3. 使用 With前後差異
- 清楚區分前面的區塊是 sub-query,最後是主 Query
- 直接進入主 Query,不用先了解細節
- 快速找到各個別名的實際內容