cross apply 和 outer apply

使用APPLY运算符可以实现查询操作的外部表表达式返回的每个调用表值函数。表值函数作为右输入,外部表表达式作为左输入。

通过对右输入求值来获得左输入每一行的计算结果,生成的行被组合起来作为最终输出。APPLY 运算符生成的列的列表是左输入

中的列集,后跟右输入返回的列的列表。

APPLY存在两种形式: CROSS APPLY 和 OUTER APPLY .

CROSS APPLY 仅返回外部表中通过表值函数生成结果集的行。

OUTER APPLY 既返回生成结果集的行,又返回不生成结果集的行,其中表值函数生成的列中的值为NULL.

create table employee
(
emp_id int not null,
mgr_id int null,
emp_name varchar(20) not null,
emp_salary money not null,
constraint pk_id primary key(emp_id)
)

insert into employee select 1,null,‘忘忘‘,4500
union all
select 2,1,‘找找‘,2500
union all
select 3,2,‘你会‘,3500
union all
select 4,3,‘牛牛‘,1500
union all
select 5,4,‘得到‘,500
union all
select 6,5,‘爱的色放‘,300
union all
select 7,6,‘爱上对方‘,1000
union all
select 8,4,‘阿萨德‘,300
union all
select 9,8,‘阿斯顿‘,1000

create table departments
(
dep_id int identity(1,1) primary key,
dep_name varchar(30) not null,
dep_m_id int null references employee(emp_id)
)
insert departments select ‘生成部门‘,2
union all
select ‘销售部门‘,7
union all
select ‘加工部门‘,8
union all
select ‘库存部门‘,9
union all
select ‘管理部门‘,4
union all
select ‘保卫部门‘,null

create function gtree
(
@emp_id int
)
returns @tree table
(
emp_id int not null,
emp_name varchar(20) not null,
mgr_id int null,
lvl int not null
)
as
begin
with emp_subtree(emp_id,emp_name,mgr_id,lvl)
as
(
select emp_id,emp_name,mgr_id,0 from employee where [email protected]_id
union all
select e.emp_id,e.emp_name,e.mgr_id,es.lvl+1
from employee e join emp_subtree es on e.emp_id=es.emp_id
)
insert @tree select * from emp_subtree
return
end
select * from employee

select * from departments as a
cross apply
gtree(a.dep_m_id) as b

select * from departments as a
outer apply
gtree(a.dep_m_id) as b

时间: 2024-11-05 04:48:33

cross apply 和 outer apply的相关文章

使用 CROSS APPLY 与 OUTER APPLY 连接查询

?  前言 日常开发中遇到多表查询时,首先会想到 INNER JOIN 或 LEFT OUTER JOIN 等等,但是这两种查询有时候不能满足需求.比如,左表一条关联右表多条记录时,我需要控制右表的某一条或多条记录跟左表匹配.貌似,INNER JOIN 或 LEFT OUTER JOIN 不能很好完成.但是 CROSS APPLY 与 OUTER APPLY 可以,下面用示例说明. 1.   示例一 ?  有两张表:Student(学生表)和 Score(成绩表),数据如下: 1)   查询每个

SQL 关于apply的两种形式cross apply 和 outer apply

例子: CREATE TABLE [dbo].[Customers]( [customerid] [char](5) COLLATE Chinese_PRC_CI_AS NOT NULL, [city] [varchar](10) COLLATE Chinese_PRC_CI_AS NOT NULL, PRIMARY KEY CLUSTERED ( [customerid] ASC )WITH (IGNORE_DUP_KEY = OFF) ON [PRIMARY] ) ON [PRIMARY]

CROSS APPLY和 OUTER APPLY 区别详解

SQL Server 2005 新增 cross apply 和 outer apply 联接语句,增加这两个东东有啥作用呢? 我们知道有个 SQL Server 2000 中有个 cross join 是用于交叉联接的.实际上增加 cross apply 和 outer apply 是用于交叉联接表值函数(返回表结果集的函数)的, 更重要的是这个函数的参数是另一个表中的字段.这个解释可能有些含混不请,请看下面的例子: -- 1. cross join 联接两个表 select * from T

SQL关于apply的两种形式cross apply和outer apply(转载)

SQL 关于apply的两种形式cross apply 和 outer apply apply有两种形式: cross apply 和 outer apply 先看看语法: <left_table_expression>  {cross|outer} apply <right_table_expression> 再让我们了解一下apply运算涉及的两个步骤: A1:把右表表达式(<right_table_expression>)应用到左表(<left_table_

CROSS APPLY 和 OUTER APPLY 区别

我们知道有个 SQL Server 2000 中有个 cross join 是用于交叉联接的.实际上增加 cross apply 和 outer apply 是用于交叉联接表值函数(返回表结果集的函数)的, 更重要的是这个函数的参数是另一个表中的字段. -- OUTER APPLYselect *  from TABLE_1 T1cross apply FN_TableValue(T1.column_a) -- OUTER APPLYselect *  from TABLE_1 T1outer 

SQLSERVER CROSS APPLY 与 OUTER APPLY 的应用

日常开发中遇到多表查询时,首先会想到 INNER JOIN 或 LEFT OUTER JOIN 等等,但是这两种查询有时候不能满足需求.比如,左表一条关联右表多条记录时,我需要控制右表的某一条或多条记录跟左表匹配.貌似,INNER JOIN 或 LEFT OUTER JOIN 不能很好完成.但是 CROSS APPLY 与 OUTER APPLY 可以 有两张表:Student(学生表)和 Score(成绩表),数据如下 1)查询每个学生最近两次的考试成绩 SELECT T1.StudentNo

SQLServer连接查询之Cross Apply和Outer Apply的区别及用法

https://blog.csdn.net/wikey_zhang/article/details/77480118 先简单了解下cross apply的语法以及会产生什么样的结果集吧! 示例表: SELECT * FROM tableA CROSS APPLY tableB 两张表直接连接,不需要任何的关联条件,产生的结果就是这两张表的笛卡儿集,在这里和上一篇帖子讲的cross join交叉连接的结果集是一样的 相当于:select * from tableA,tableB 与之对应的还有Ou

SQL Server中CROSS APPLY和OUTER APPLY的应用详解

SQL Server数据库操作中,在2005以上的版本新增加了一个APPLY表运算符的功能.新增的APPLY表运算符把右表表达式应用到左表表达式中的每一行.它不像JOIN那样先计算那个表表达式都可以,APPLY必选先逻辑地计算左表达式.这种计算输入的逻辑顺序允许吧右表达式关联到左表表达式. APPLY有两种形式,一个是OUTER APPLY,一个是CROSS APPLY,区别在于指定OUTER,意味着结果集中将包含使右表表达式为空的左表表达式中的行,而指定CROSS,则相反,结果集中不包含使右表

SQLSERVER表连接(INNER JOIN,LEFT JOIN,RIGHT JOIN,FULL JOIN,CROSS JOIN,CROSS APPLY,OUTER APPLY)

1 常用表连接(inner join,left join,right join,full join,cross join) if object_id(N'table1',N'U') is not null drop table table1 if object_id(N'table2',N'U') is not null drop table table2 create table table1(id int,name varchar(20)) insert into table1 select