首页 > 数据库 >sql server cross/outer apply 用法

sql server cross/outer apply 用法

时间:2022-10-31 12:00:09浏览次数:35  
标签:outer 表值 join sql cross APPLY apply select

这是 sql server 帮助文档关于apply的描述:

      使用 APPLY 运算符(2005或以上版本)可以为实现查询操作的外部表表达式返回的每个行调用表值函数。表值函数作为右输入,外部表表达式作为左输入。通过对右输入求值来获得左输入每一行的计算结果,生成的行被组合起来作为最终输出。APPLY 运算符生成的列的列表是左输入中的列集,后跟右输入返回的列的列表。

      APPLY 有两种形式: CROSS APPLY 和 OUTER APPLY。CROSS APPLY 仅返回外部表中通过表值函数生成结果集的行。OUTER APPLY 既返回生成结果集的行,也返回不生成结果集的行,其中表值函数生成的列中的值为 NULL。

看一下例子:

select * from table1 join MyFunction(1) on 1=1

MyFunction 的参数是一个常量,可以返回一个表。

但有时候我们希望以 table1 的字段作为参数,传进函数去计算,像:

select * from table1 join MyFunction(id) on 1=1

这样是会出错的。这个时候我们就可以用 apply 来实现了。例如:

select * from table1 cross apply MyFunction(id) on 1=1

简单的说,apply 允许我们将前面结果集每一行的数据作为参数,传递到后面的表达式,后面的表达式可以是一个表值函数,或者select结果集。

实际项目应用:

产品表和点击率统计表,按产品最近一个月点击率排序。

如果不用apply,实现起来就比较麻烦,用 apply 实现起来大概就是这样的:

;with cteResult as(
   select row_number() over(order by HitCount) as rowid,
          ProductID,
          ProductName
     from ProductInfo pi with(nolock)
    outer apply(select sum(HitCount) HitCount from HitStatisticsInfo hsi
    where hsi.TargetID = pi.ProductID
      and hsi.HitTime >= '2015-08-08'
    group by TargetID) hsi
    where pi.IsDel = 0)
select * from cteResult where rowid between 1 and 20
 

至于 cross apply 与 outer apply 的区别就好像left join 与 join 的区别。如果 apply 不生成行,outer apply 也会返回该行,而 cross apply 则不会输出该行。

so,当你在需要将某个字段的值作为参数使用时,或者用join实现起来比较复杂时,就可以考虑apply来实现。

标签:outer,表值,join,sql,cross,APPLY,apply,select
From: https://www.cnblogs.com/123525-m/p/16843817.html

相关文章

  • SQL Server STUFF() 函数详解
    https://www.cnblogs.com/gzb1/p/16401441.htmlSTUFF():在SQLServer中,stuff()函数用于从源字符串中删除给定长度的字符序列,并从指定的起始索引插入给定的字符序列。用......
  • mysql查询转换
     查询时会将字符串转数字.如果转换数字不成功,则看做0两边都是字符串的话,则按照ANSI的比较规则进行比较,不区分大小写(具体看mysql配置)  ......
  • MYSQL - Warning: #1681 Integer display width is deprecated
    ​​MYSQL-Warning:#1681Integerdisplaywidthisdeprecated​​mysql8.0不支持,这里就不要使用Int了,换成`id`bigintNOTNULLAUTO_INCREMENT, ......
  • sqlServer执行计划分析
    SQLServerManagementStudio是一个交互式图形工具,使数据库管理员或开发人员可以编写查询、同时执行多个查询、查看结果、分析查询计划以及获得提高查询性能的帮助。如......
  • centos7 yum安装mysql5.7 Linux服务器数据库
    wgethttp://dev.mysql.com/get/mysql57-community-release-el7-11.noarch.rpmyum-yinstallmysql57-community-release-el7-11.noarch.rpm#改镜像vi/etc/yum.repo......
  • SQLServer备份信息查看
    查看数据文件和日志文件的备份记录SELECT[filegroup_name],[backed_up_page_count],[file_type],[file_size],[logical_name],[phy......
  • MySQL的默认值约束(Default),数据库设计必备
    一、默认值约束简介默认值(Default)的完整称呼是默认值约束(DefaultConstraint)。MySQL默认值约束用来指定某列的默认值。例如女性员工较多,性别就可以默认为“女”。如果插入......
  • mysql主从同步单点故障
    请问Mysql主从同步问题mysql主从同步的步骤一、主机环境master操作系统:rhel6.0IP:172.16.0.100MySQL版本:5.1.47www.2cto.comslave操作系统:rhel6.0IP:172.16.0.200MySQL版本:5.1......
  • mysql主从同步延迟怎么解决
    mysql主从同步是一直进行的吗有两种方法,一种方法使用mysql的checktable和repairtable的sql语句,另一种方法是使用MySQL提供的多个myisamchk,isamchk数据检测恢复工具。前者使......
  • MySQL的主键(PRIMARY KEY),重要性太高
    一、什么是主键主键(PRIMARYKEY)的又叫做“主键约束”,MySQL主键约束是一个单独的列或者多个列的组合,其值能唯一地标识表中的一行数据。这样的一列或多列称为表的主键,通过它......