热门标签 | HotTags
当前位置:  开发笔记 > 数据库 > 正文

SQLSERVER中apply操作符

您现在的位置:首页教程编程开发mssql数据库SQLSERVER中apply操作符SQLSERVER中apply操作符感谢3lian8的投递时间:2014-03-10来源:三联教程apply操作符使用APPLY运算符可以为实现查询操作的外部表表达式返回的每个行调用表值函数。表值函

您现在的位置:首页>教程>编程开发>mssql数据库 > SQL SERVER中apply操作符 SQL SERVER中apply操作符 感谢 3lian8 的投递 时间:2014-03-10 来源:三联教程 apply操作符 使用 APPLY 运算符可以为实现查询操作的外部表表达式返回的每个行调用表值函数。表值函

您现在的位置:首页 > 教程 > 编程开发 > mssql数据库 > SQL SERVER中apply操作符

SQL SERVER中apply操作符

感谢 3lian8 的投递 时间:2014-03-10 来源:三联教程 

apply操作符

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

基础准备

创建测试表:

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

create table test4

(

id int identity(1,1),

name varchar(100)

)

create table test4Score

(

test4id int,

score int

)

insert into test4(name)

select 'LeeWhoeeUniversity'

union all

select 'LeeWhoee'

union all

select 'DePaul'

insert into test4score(test4id,score)

select 1,100

union all

select 1,90

union all

select 1,90

union all

select 1,80

union all

select 2,90

union all

select 2,82

union all

select 2,10

test4表中数据:

id name
1 LeeWhoeeUniversity
2 LeeWhoee
3 DePaul

test4score表中数据:

test4id score
1 100
1 90
1 90
1 80
2 90
2 82
2 10

APPLY

现在用APPLY操作符仅获取每个name的两个最高score记录:

?

1

2

3

4

5

select * from test4 a

cross apply

(

select top 2 * from test4score where test4id=a.id order by score desc

) b

分析如下:

右输入-- select top 2 * from test4score where test4id=a.id order by score desc

左输入--select * from test4

右输入求值对左输入的每一行进行计算。

更进一步分析:

左输入第一行是1 LeeWhoeeUniversity

右输入计算左输入第一行id最高两个score记录得出:

id test4id score
1 1 100
3 1 90

组合行:

id name test4id score
1 LeeWhoeeUniversity 1 100
1 LeeWhoeeUniversity 1 90

以此类推,直至完成左输入所有行的计算。

结果如下:

id name test4id score
1 LeeWhoeeUniversity 1 100
1 LeeWhoeeUniversity 1 90
2 LeeWhoee 2 90
2 LeeWhoee 2 82

OUTER APPLY

outer apply 类似于LEFT JOIN,

?

1

2

3

4

5

select * from test4 a

outer apply

(

select top 2 * from test4score where test4id=a.id order by score desc

) b

id name test4id score
1 LeeWhoeeUniversity 1 100
1 LeeWhoeeUniversity 1 90
2 LeeWhoee 2 90
2 LeeWhoee 2 82
3 DePaul NULL NULL

由于test4score表中没有'DePaul'的记录,所以用NULL值填充。

当然还有更多的方法来实现此需求,如使用排名函数ROW_NUMBER:

?

1

2

3

4

select b.name,a.score from(

select *,ROW_NUMBER()over(partition by test4id order by score desc) as rum from test4score

) a

inner join test4 b on b.id=a.test4id where rum <3

结果:

name score
LeeWhoeeUniversity 100
LeeWhoeeUniversity 90
LeeWhoee 90
LeeWhoee 82

此方法是用前面介绍的ROW_NUMBER()和PARTITION BY来实现,详细请见:

SQL SERVER排名函数RANK,,DENSE_RANK,NTILE,ROW_NUMBER

还有一种更古老的方法,但是必须给test4socre表添加标识列,新表结构如下:

?

1

2

3

4

5

6

create table test4Score

(

id int identity(1,1),

test4id int,

score int

)

新数据:

id test4id score
1 1 100
2 1 90
3 1 90
4 1 80
5 2 90
6 2 82
7 2 10

用带子查询的SQL语句:

?

1

2

3

4

select a.name,b.score from test4 a inner join test4score b on a.id=b.test4id where b.id in

(

select top 2 id from test4score where test4id=b.test4id order by score desc

)

结果:

name score
LeeWhoeeUniversity 100
LeeWhoeeUniversity 90
LeeWhoee 90
LeeWhoee 82

相关文章

标签:

[返回三联首页] [返回mssql数据库栏目] / [加入三联文集]

推荐阅读
  • 本文深入探讨了MySQL中的高级特性,包括索引机制、锁的使用及管理、以及如何利用慢查询日志优化性能。适合有一定MySQL基础的读者进一步提升技能。 ... [详细]
  • 将XML数据迁移至Oracle Autonomous Data Warehouse (ADW)
    随着Oracle ADW的推出,数据迁移至ADW成为业界关注的焦点。特别是XML和JSON这类结构化数据的迁移需求日益增长。本文将通过一个实际案例,探讨如何高效地将XML数据迁移至ADW。 ... [详细]
  • PHP中Smarty模板引擎自定义函数详解
    本文详细介绍了如何在PHP的Smarty模板引擎中自定义函数,并通过具体示例演示了这些函数的使用方法和应用场景。适合PHP后端开发者学习。 ... [详细]
  • 本文详细介绍了MySQL InnoDB存储引擎中的Redo Log和Undo Log,探讨了它们的工作原理、存储方式及其在事务处理中的关键作用。 ... [详细]
  • 本文探讨了MySQL中的死锁现象及其监控方法,并介绍了如何通过配置和SQL语句调整来优化数据库性能。同时,还讲解了慢查询日志的配置与分析技巧。 ... [详细]
  • MVC模式下的电子取证技术初探
    本文探讨了在MVC(模型-视图-控制器)架构下进行电子取证的技术方法,通过实际案例分析,提供了详细的取证步骤和技术要点。 ... [详细]
  • 【MySQL】frm文件解析
    官网说明:http:dev.mysql.comdocinternalsenfrm-file-format.htmlfrm是MySQL表结构定义文件,通常frm文件是不会损坏的,但是如果 ... [详细]
  • 数据输入验证与控件绑定方法
    本文提供了多种数据输入验证函数及控件绑定方法的实现代码,包括电话号码、数字、传真、邮政编码、电子邮件和网址的验证,以及报表绑定和自动编号等功能。 ... [详细]
  • 本文介绍了MySQL窗口函数的基本概念、应用场景及常见函数的使用方法。窗口函数在处理复杂查询时非常有用,例如计算每个用户的订单排名、环比增长率、以及动态聚合等。 ... [详细]
  • 本文介绍了如何在 Oracle 数据库中查询重复数据,并提供了多种方法来筛选和删除重复记录,包括基于单个字段和多个字段的重复数据处理。 ... [详细]
  • 美团安全响应中心推出全新配送业务测试活动,带来双重福利,邀您共同参与! ... [详细]
  • 1、编写一个Java程序在屏幕上输出“你好!”。programmenameHelloworld.javapublicclassHelloworld{publicst ... [详细]
  • 解决ADODB连接Access时出现80004005错误的方法
    本文详细介绍了如何解决在使用ADODB连接Access数据库时遇到的80004005错误,包括错误原因分析和具体的解决步骤。 ... [详细]
  • binlog2sql,你该知道的数据恢复工具
    binlog2sql,你该知道的数据恢复工具 ... [详细]
  • Hibernate全自动全映射ORM框架,旨在消除sql,是一个持久层的ORM框架1)、基础概念DAO(DataAccessorOb ... [详细]
author-avatar
mobiledu2502909217
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有