使用 APPLY
来源:互联网 发布:宋佳和谢天笑 知乎 编辑:程序博客网 时间:2024/05/21 16:14
使用 APPLY 运算符可以为实现查询操作的外部表表达式返回的每个行调用表值函数。表值函数作为右输入,外部表表达式作为左输入。通过对右输入求值来获得左输入每一行的计算结果,生成的行被组合起来作为最终输出。APPLY 运算符生成的列的列表是左输入中的列集,后跟右输入返回的列的列表。
若要使用 APPLY,数据库兼容级别必须至少为 90。
APPLY 有两种形式:CROSS APPLY 和 OUTER APPLY。CROSS APPLY 仅返回外部表中通过表值函数生成结果集的行。OUTER APPLY 既返回生成结果集的行,也返回不生成结果集的行,其中表值函数生成的列中的值为 NULL。
例如,考虑下列表 Employees 和 Departments:
复制
--Create Employees table and insert values.CREATE TABLE Employees( empid int NOT NULL ,mgrid int NULL ,empname varchar(25) NOT NULL ,salary money NOT NULL CONSTRAINT PK_Employees PRIMARY KEY(empid));GOINSERT INTO Employees VALUES(1 , NULL, 'Nancy' , $10000.00);INSERT INTO Employees VALUES(2 , 1 , 'Andrew' , $5000.00);INSERT INTO Employees VALUES(3 , 1 , 'Janet' , $5000.00);INSERT INTO Employees VALUES(4 , 1 , 'Margaret', $5000.00);INSERT INTO Employees VALUES(5 , 2 , 'Steven' , $2500.00);INSERT INTO Employees VALUES(6 , 2 , 'Michael' , $2500.00);INSERT INTO Employees VALUES(7 , 3 , 'Robert' , $2500.00);INSERT INTO Employees VALUES(8 , 3 , 'Laura' , $2500.00);INSERT INTO Employees VALUES(9 , 3 , 'Ann' , $2500.00);INSERT INTO Employees VALUES(10, 4 , 'Ina' , $2500.00);INSERT INTO Employees VALUES(11, 7 , 'David' , $2000.00);INSERT INTO Employees VALUES(12, 7 , 'Ron' , $2000.00);INSERT INTO Employees VALUES(13, 7 , 'Dan' , $2000.00);INSERT INTO Employees VALUES(14, 11 , 'James' , $1500.00);GO--Create Departments table and insert values.CREATE TABLE Departments( deptid INT NOT NULL PRIMARY KEY ,deptname VARCHAR(25) NOT NULL ,deptmgrid INT NULL REFERENCES Employees);GOINSERT INTO Departments VALUES(1, 'HR', 2);INSERT INTO Departments VALUES(2, 'Marketing', 7);INSERT INTO Departments VALUES(3, 'Finance', 8);INSERT INTO Departments VALUES(4, 'R&D', 9);INSERT INTO Departments VALUES(5, 'Training', 4);INSERT INTO Departments VALUES(6, 'Gardening', NULL);
Departments 表中的多数部门都具有一个经理 ID,这些 ID 与 Employees 表中的雇员相对应。以下表值函数接受雇员 ID 作为参数,并返回该雇员和他/她的所有下属。
复制
CREATE FUNCTION dbo.fn_getsubtree(@empid AS INT) RETURNS @TREE TABLE( empid INT NOT NULL ,empname VARCHAR(25) NOT NULL ,mgrid INT NULL ,lvl INT NOT NULL)ASBEGIN WITH Employees_Subtree(empid, empname, mgrid, lvl) AS ( -- Anchor Member (AM) SELECT empid, empname, mgrid, 0 FROM Employees WHERE empid = @empid UNION all -- Recursive Member (RM) SELECT e.empid, e.empname, e.mgrid, es.lvl+1 FROM Employees AS e JOIN Employees_Subtree AS es ON e.mgrid = es.empid ) INSERT INTO @TREE SELECT * FROM Employees_Subtree; RETURNENDGO
若要返回每个部门经理的各级下属,请使用以下查询。
复制
SELECT D.deptid, D.deptname, D.deptmgrid ,ST.empid, ST.empname, ST.mgridFROM Departments AS D CROSS APPLY fn_getsubtree(D.deptmgrid) AS ST;
下面是结果集:
复制
deptid deptname deptmgrid empid empname mgrid lvl----------- ---------- ----------- ----------- ---------- ----------- ---1 HR 2 2 Andrew 1 01 HR 2 5 Steven 2 11 HR 2 6 Michael 2 12 Marketing 7 7 Robert 3 02 Marketing 7 11 David 7 12 Marketing 7 12 Ron 7 12 Marketing 7 13 Dan 7 12 Marketing 7 14 James 11 23 Finance 8 8 Laura 3 04 R&D 9 9 Ann 3 05 Training 4 4 Margaret 1 05 Training 4 10 Ina 4 1
注意,Departments 表中每一行复制的次数与针对部门经理执行 fn_getsubtree 而返回的行数相同。
另外,结果中不显示 Gardening 部门。因为该部门没有经理,所以 fn_getsubtree 将针对该部门返回空集。通过使用 OUTER APPLY,Gardening 部门也将在结果集中显示,其deptmgrid 字段以及由fn_getsubtree 返回的字段中的值都为 Null 值。
转载
https://msdn.microsoft.com/zh-cn/library/ms175156.aspx
0 0
- 使用 APPLY
- apply 使用
- 使用 APPLY
- Ext.apply() 的使用
- Js apply()使用详解
- Js apply()使用详解
- Js apply()使用详解
- Js apply()使用详解
- JavaScript -- apply的使用
- Js apply()使用详解
- Js apply()使用详解
- Js apply()使用详解
- js apply()使用详解
- 使用 apply 调用函数
- Js apply()使用详解
- Js apply()使用详解
- javascript apply()使用详解
- Js apply()使用详解
- 黑马程序员--Java基础Day03
- hdu 1698 Just a Hook
- LA 4256 Salesmen 线性dp
- OC release之后 retainCount为何为1
- Ecliplse 重命名后web.xml 报错Attribute "xmlns" was already specified for element "web-app".
- 使用 APPLY
- Servlet,Filter,Listener,Interceptor
- JavaScript:Object.prototype.toString方法的原理
- Java连接sqlserver数据库
- 对于计算机网络课本中一个题目理解
- [Servlet]Servlet的继承链
- android 中如何分析内存泄漏
- C语言字符和字符串操作
- iOS开发学习第十二课——函数指针定义 、函数回调 、动态排序