zoukankan      html  css  js  c++  java
  • Sql Server中不常用的表运算符之APPLY(1)

    写在这个系列的前面:

    就像他们的名字一样,作为一个表运算,他们用来运算左表和右表。JOIN也是一个表运算符,不过他太常用了。

    APPLY:

    将右表表达式应用在左表的每一行上。

    APPLY是Sql2005对SQL语句的拓展,这意味着其他类型的数据库可能不支持这个表运算符。微软设计APPLY的初衷在于将表值函数运用在左表的每一行,并将结果与对应行关联起来。

    网上大多数文章中提到的也是这样的用法,例如我们有一个Split(s,splitChar)表值函数,可以将一个字符串s用splitChar分割,返回分割后的表。

    现在有这样一张表:dbo.ApplyCase1

    s
    swer,23,wer,234
    wer,wer,234

    下面这个查询将会把Split这个表值函数(右表表达式)运用在dbo.ApplyCase1(左表表达式)中的每一行上,并把结果与对应行关联。

    SELECT s,ct.strValue FROM dbo.ApplyCase1 AS ac CROSS APPLY dbo.Split(s,',') ct WHERE  ct.strValue<>ac.s

    where 可以无视,主要是为了与INNER JOIN相比较。结果如下

    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的两个特点

    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过滤中通过比较来建立左表和右表的联系。

  • 相关阅读:
    Nginx分发服务
    apache+nginx 实现动静分离
    mysql 配置
    mysql 配置,还得多看看~
    Linux安装字体
    Oracle10g中阻塞锁查询更简单
    Access WMI via Python from Linux
    安装filezilla client报错libgnutls版本旧
    tomcat 服务形式检测
    JMX实现远程服务器Tomcat系统监控之三
  • 原文地址:https://www.cnblogs.com/iiaijimaai/p/3604254.html
Copyright © 2011-2022 走看看