《Sql语句中APPLY运算符的应用》由会员分享,可在线阅读,更多相关《Sql语句中APPLY运算符的应用(6页珍藏版)》请在金锄头文库上搜索。
1、Sql 语句中 APPLY 运算符的应用摘 要 使用 APPLY 运算符可以为实现查询操作的外部表表达式返回的每个行调用表值函数。表值函数作为右输入,外部表表达式作为左输入。通过对右输入求值来获得左输入每一行的计算结果,生成的行被组合起来作为最终输出。 关键词 Sql 语句 APPLY 运算符 应用 使用 APPLY 运算符可以为实现查询操作的外部表表达式返回的每个行调用表值函数。表值函数作为右输入,外部表表达式作为左输入。通过对右输入求值来获得左输入每一行的计算结果,生成的行被组合起来作为最终输出。APPLY 运算符生成的列的列表是左输入中的列集,后跟右输入返回的列的列表。 APPLY 有两
2、种形式:CROSS APPLY 和 OUTER APPLY。CROSS APPLY 仅返回外部表中通过表值函数生成结果集的行。OUTER APPLY 既返回生成结果集的行,也返回不生成结果集的行,其中表值函数生成的列中的值为 NULL。 例如,下列表 Employees 和 Departments: CREATE TABLE Employees ( empid int NOT NULL mgrid int NULL empname varchar(25) NOT NULL salary money NOT NULL CONSTRAINT PK_Employees PRIMARY KEY(emp
3、id) ) ; INSERT 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) ;
4、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 Empl
5、oyees 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) ; CREATE TABLE Departments ( deptid INT NOT NULL PRIMARY KEY deptname VARCHAR(25) NOT NULL de
6、ptmgrid INT NULL REFERENCES Employees ) ; INSERT 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 V
7、ALUES(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 ) AS BEGIN WITH Employees_S
8、ubtree(empid, empname, mgrid, lvl) AS ( SELECT empid, empname, mgrid, 0 FROM Employees WHERE empid = empid UNION all SELECT e.empid, e.empname, e.mgrid, es.lvl+1 FROM Employees ASe JOIN Employees_Subtree ASes ON e.mgrid = es.empid; ) INSERT INTO TREE SELECT * FROM Employees_Subtree; RETURN END 若要返回每
9、个部门经理的各级下属,请使用以下查询。SELECT D.deptid, D.deptname, D.deptmgrid ,ST.empid, ST.empname, ST.mgrid FROM Departments AS D CROSSAPPLY fn_getsubtree(D.deptmgrid) AS ST; 注意,Departments 表中每一行复制的次数与针对部门经理执行 fn_getsubtree 而返回的行数相同。 另外,?Y 果中不显示 Gardening 部门。因为该部门没有经理,所以 fn_getsubtree 将针对该部门返回空集。通过使用 OUTER APPLY,Gardening 部门也将在结果集中显示,其 deptmgrid 字段以及由 fn_getsubtree 返回的字段中的值都为空值。 参考文献 1 杜佰林.网络数据库 SQL Server 2000M.清华出版社,2009,09. 2 何薇,舒后.网络数据库技术与应用M.清华大学出版社,2014,10.