[2005每日一学]APPLY运算符(4) 0CSDN]

发布时间:2016-12-9 23:25:41 编辑:www.fx114.net 分享查询网我要评论
本篇文章主要介绍了"[2005每日一学]APPLY运算符(4) 0CSDN]",主要涉及到[2005每日一学]APPLY运算符(4) 0CSDN]方面的内容,对于[2005每日一学]APPLY运算符(4) 0CSDN]感兴趣的同学可以参考一下。

    使用 APPLY 运算符可以为实现查询操作的外部表表达式返回的每个行调用表值函数。表值函数作为右输入,外部表表达式作为左输入。通过对右输入求值来获得左输入每一行的计算结果,生成的行被组合起来作为最终输出。APPLY 运算符生成的列的列表是左输入中的列集,后跟右输入返回的列的列表。  APPLY 有两种形式: CROSS APPLY 和 OUTER APPLY。CROSS APPLY 仅返回外部表中通过表值函数生成结果集的行。OUTER APPLY 既返回生成结果集的行,也返回不生成结果集的行,其中表值函数生成的列中的值为 NULL。 示例:     --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), ) GO 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) 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 ) GO 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 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 ) AS BEGIN   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   RETURN END GO 其中,上面的函数用到了CTE递归查询,相关的内容,可参考“Books Online" 若要返回每个部门经理的所有级别的全部下属,请使用下面的查询: SELECT * FROM Departments AS D   CROSS APPLY fn_getsubtree(D.deptmgrid) AS ST 查询结果如下: 1 HR 2 2 Andrew 1 0 1 HR 2 5 Steven 2 1 1 HR 2 6 Michael 2 1 2 Marketing 7 7 Robert 3 0 2 Marketing 7 11 David 7 1 2 Marketing 7 12 Ron 7 1 2 Marketing 7 13 Dan 7 1 2 Marketing 7 14 James 11 2 3 Finance 8 8 Laura 3 0 4 R&D 9 9 Ann 3 0 5 Training 4 4 Margaret 1 0 5 Training 4 10 Ina 4 1 修改查询为OUTER APPLY,结果为: 1 HR 2 2 Andrew 1 0 1 HR 2 5 Steven 2 1 1 HR 2 6 Michael 2 1 2 Marketing 7 7 Robert 3 0 2 Marketing 7 11 David 7 1 2 Marketing 7 12 Ron 7 1 2 Marketing 7 13 Dan 7 1 2 Marketing 7 14 James 11 2 3 Finance 8 8 Laura 3 0 4 R&D 9 9 Ann 3 0 5 Training 4 4 Margaret 1 0 5 Training 4 10 Ina 4 1 6 Gardening NULL NULL NULL NULL NULL 更多详细资料参考“Books Online" 以往帖子: [2005每日一学]DDL触发器(1)  http://community.csdn.net/Expert/topic/4910/4910909.xml?temp=.5234644 2005每日一学]XML数据类型(2)  http://community.csdn.net/Expert/topic/4913/4913373.xml?temp=.579159 2005每日一学]排名函数(3) http://community.csdn.net/Expert/topic/4918/4918884.xml?temp=.3263056

强烈支持LZ,受益非浅啊!

上一篇:2005每日一学]排名函数(3) 0CSDN]
下一篇:2005每日一学]使用大值数据类型(5) 0CSDN]

相关文章

相关评论