寫在這個系列的前面:數據庫
就像他們的名字同樣,做爲一個表運算,他們用來運算左表和右表。JOIN也是一個表運算符,不過他太經常使用了。函數
APPLY:spa
將右表表達式應用在左表的每一行上。設計
APPLY是Sql2005對SQL語句的拓展,這意味着其餘類型的數據庫可能不支持這個表運算符。微軟設計APPLY的初衷在於將表值函數運用在左表的每一行,並將結果與對應行關聯起來。code
網上大多數文章中提到的也是這樣的用法,例如咱們有一個Split(s,splitChar)表值函數,能夠將一個字符串s用splitChar分割,返回分割後的表。blog
如今有這樣一張表:dbo.ApplyCase1字符串
s |
swer,23,wer,234 |
wer,wer,234 |
下面這個查詢將會把Split這個表值函數(右表表達式)運用在dbo.ApplyCase1(左表表達式)中的每一行上,並把結果與對應行關聯。it
SELECT s,ct.strValue FROM dbo.ApplyCase1 AS ac CROSS APPLY dbo.Split(s,',') ct WHERE ct.strValue<>ac.s
where 能夠無視,主要是爲了與INNER JOIN相比較。結果以下table
s | strValue |
swer,23,wer,234 | swer |
swer,23,wer,234 | 23 |
swer,23,wer,234 | wer |
swer,23,wer,234 | 234 |
wer,wer,234 | wer |
wer,wer,234 | wer |
wer,wer,234 | 234 |
這裏能夠看出APLLY的兩個特色class
1.將右表表達式應用在左表的每一行上。
2.右表表達式能夠使用左表中的列。
假如咱們換成以下查詢則會報錯
SELECT s,ct.strValue FROM dbo.ApplyCase1 AS ac INNER JOIN dbo.Split(s,',') ct ON ct.strValue<>ac.s
錯誤以下
Msg 207, Level 16, State 1, Line 1
Invalid column name 's'.
由於INNER JOIN沒法直接使用左表的列,而只能在ON過濾中經過比較來創建左表和右表的聯繫。