閱文時長 | | 1.26分鍾 | 字數統計 | | 2027.2字符 |
主要內容 | | 1、引言&背景 2、官方定義&示例 3、CROSS APPLY和CROSS JOIN是等價的嗎?如果不等價的話,區別在哪里? 4、聲明與參考資料 | ||
『MSSQL·APPLY關鍵字的學習理解』 | |||
編寫人 | | SCscHero | 編寫時間 | | 2021/8/19 PM9:9 |
文章類型 | | 系列 | 完成度 | | 已完成 |
座右銘 | 每一個偉大的事業,都有一個微不足道的開始。 |
一、引言&背景 完成度:100%
a) 應對問題
- APPLY關鍵字的基本用法、作用、官方定義、使用場景是怎樣的?
- CROSS APPLY和CROSS JOIN是等價的嗎?如果不等價的話,區別在哪里?
- OUTER APPLY和CROSS APPLY區別是什么?
b) 應對場景
- 涉及APPLY關鍵字的場景、或涉及CROSS APPLY的場景。
- 涉及到表值函數相關的場景。
c) 術語概念
笛卡爾積:笛卡爾乘積是指在數學中,兩個集合X和Y的笛卡爾積(Cartesian product),又稱直積,表示為X × Y,第一個對象是X的成員而第二個對象是Y的所有可能有序對的其中一個成員。通俗理解的話博主可以舉個例子,例如有兩個集合,一個有Y個元素,一個有X個元素,那么他們的笛卡爾積就是X × Y個元素。
二、官方定義&示例 完成度:100%
a) CROSS JOIN的官方定義
The Crossjoin function returns the cross product of two or more specified sets. The order of tuples in the resulting set depends on the order of the sets to be joined and the order of their members. For example, when the first set consists of {x1, x2,...,xn}, and the second set consists of {y1, y2, ..., yn}, the cross product of these sets is:
{(x1, y1), (x1, y2),...,(x1, yn), (x2, y1), (x2, y2),...,
(x2, yn),..., (xn, y1), (xn, y2),..., (xn, yn)}----來自《微軟英文文檔·Crossjoin (MDX)》[1]
b) APPLY的官方定義
APPLY運算符的左操作數和右操作數都是表表達式。這些操作數之間的主要區別是,right_table_source可以使用表值函數,該函數可從left_table_source獲取一個列作為函數的參數之一。left_table_source可以包括表值函數,但不能以來自 right_table_source的列作為參數。
APPLY運算符通過以下方式工作,以便為FROM子句生成表源:
針對left_table_source的每一行計算right_table_source以生成行集。
right_table_source中的值取決於left_table_source。right_table_source可以按以下方式近似表示:TVF(left_table_source.row),其中,TVF是表值函數。
通過執行UNION ALL操作,將計算right_table_source的值時為每行生成的結果集與left_table_source組合起來。
APPLY運算符的結果生成的列的列表是來自left_table_source(與來自right_table_source的列的列表相組合)的一組列。----來自《微軟中文文檔·使用Apply》[2]
c) Apply官方示例
- 將左結果集作為參數傳入表值函數。
- 這里還介紹了下OUTER APPLY和CORSS APPLY的區別:即,左結果集沒有匹配到右邊結果集(表值函數中的數據)的情況:
CROSS APPLY:不顯示左結果集中未匹配到的記錄。類似於INNER JOIN。
OUTER APPLY:顯示左結果集中匹配到的記錄。類似於LEFT JOIN。

三、CROSS APPLY和CROSS JOIN是等價的嗎?如果不等價的話,區別在哪里? 完成度:100%
a) 等價的情況
- 如果使用無條件連接的話。如下圖,兩種寫法是等價的。都是顯示笛卡爾積。

b) 不等價的情況
不等價情況:CROSS JOIN和CROSS APPLY語法結構上的不同。例如CROSS JOIN帶上條件會報錯。

四、聲明與參考資料 完成度:100%
微軟中文文檔·FROM 子句以及 JOIN、APPLY、PIVOT (Transact-SQL)
原創博文,未經許可請勿轉載。
如有幫助,歡迎點贊、收藏、關注。如有問題,請評論留言!如需與博主聯系的,直接博客私信SCscHero即可。