Sql Server中不經常使用的表運算符之APPLY(1)

寫在這個系列的前面:數據庫

就像他們的名字同樣,做爲一個表運算,他們用來運算左表和右表。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過濾中經過比較來創建左表和右表的聯繫。

相關文章
相關標籤/搜索