写在这个系列的前面:数据库
就像他们的名字同样,做为一个表运算,他们用来运算左表和右表。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过滤中经过比较来创建左表和右表的联系。