<刁鑽專業-程式設計SQL-CROSS APPLY> 沈源有 2026.0115
這不是天書, 但我相信, 讀懂之後, 會讓人感到通透, 舒暢,
原來 SQL 還能這樣被理解, 好似盤古開天闢地, 打破混沌的震撼?
----
JOIN ON = 靜態匹配 → 固定條件、行對行
CROSS APPLY = 動態匹配 + 計算 → 每行都可執行「個人化子查詢」
CROSS APPLY 可以當作 JOIN table/view ON 1=1 使用,
但還可以比 JOIN更強大, 把外層的 from table/view 的欄位值當變數給 CROSS APPLY 使用.
----
二者可互換的極限在哪?
任何的 JOIN ... ON 都可以改寫成 CROSS APPLY (SELECT ... FROM ... WHERE ...)
因為 CROSS APPLY 本質上是一個「針對每行執行子查詢」的操作,單純比對列的 JOIN 就能用子查詢寫出來。
但反之未必.
CROSS APPLY 可以使用 外層列作為參數、做動態計算、取 TOP/N 或聚合。
這些動態計算的結果 JOIN ON 無法直接表達,除非用子查詢或函數變通。
這才是 CROSS APPLY 的核心價值, 否則只要 JOIN-ON 就夠用了.
----
CROSS APPLY
感覺是硬把 VIEW 從一層扒開成二層...
為了讓 SELECT 之前 先產生一個 column, 然後 select 就可以使用.
否則就要重複寫多次
有點像硬是把平面的 select 變成立體的.
本來沒有程式設計的步驟(設變數), 但硬是可以設變數(新增欄位名稱)給 select 使用.
----
只可惜, 沒有 CROSS APPLY AFTER GROUP
類似 WHERE 和 HAVING 這樣
非要套個 Subquery,強迫性嵌套 (Mandatory Nesting)。
這就像是明明已經進了客廳(Group),想去廚房(Apply)
卻被要求必須先走出大門重新刷卡進來一次。
SQL 不該是「套娃」(Nested Subqueries),應該是「流水線」。










