<刁鑽專業-程式設計SQL-CROSS APPLY> 沈源有 2026.0115

shenyy0
·
·
IPFS
·

<刁鑽專業-程式設計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),應該是「流水線」。

CC BY-NC-ND 4.0 授权

喜欢我的作品吗?别忘了给予支持与赞赏,让我知道在创作的路上有你陪伴,一起延续这份热忱!