SQL Server 2005参考:Apply运算符
SQL Server 2005參考:Apply運算符
使用 APPLY 運算符可以為實現查詢操作的外部表表達式返回的每個行調用表值函數。表值函數作為右輸入,外部表表達式作為左輸入。通過對右輸入求值來獲得左輸入每一行的計算結果,生成的行被組合起來作為最終輸出。
APPLY 運算符生成的列的列表是左輸入中的列集,后跟右輸入返回的列的列表。
APPLY 有兩種形式: CROSS APPLY 和 OUTER APPLY。CROSS APPLY 僅返回外部表中通過表值函數生成結果集的行。OUTER APPLY 既返回生成結果集的行,也返回不生成結果集的行,其中表值函數生成的列中的值為 NULL。
--Create table Employees table and insert Values
CREATE TABLE Employees
(
??? 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 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)
CREATE TABLE Departments
(
??? dep_id INT NOT NULL,
??? dep_name VARCHAR(30) NOT NULL,
??? dep_m_id INT NULL REFERENCES Employees(emp_id)
)
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(即dep_m_id)也是來自與Employees 表中的雇員(即與某一dep_id對應)。
-- 下面的表值函數使用雇員ID 作為參數,并返回該雇員及其所有下屬
CREATE FUNCTION fn_getSubTree
(
??? @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 Employees WHERE emp_id=@emp_id
?????? UNION ALL
?????? SELECT e.emp_id,e.emp_name,e.mgr_id,es.lvl+1
?????? FROM Employees e JOIN emp_subtree es ON e.mgr_id=es.emp_id
??? )
??? INSERT INTO @tree
??? SELECT * FROM emp_subtree
??? RETURN
END
?
-- 返回每個部門經理的所有級別的全部下屬
SELECT * FROM Departments AS D CROSS APPLY fn_getsubtree(D.dep_m_id) AS ST
-- 園藝部門不會顯示在結果中。因為此部門沒有經理,fn_getsubtree 為其返回了一個空集.
-- 使用OUTER APPLY,園藝部門也會顯示在結果集中,其中deptmgrid 字段中的值以及fn_getsubtree 返回的字段中的值均為NULL.
SELECT * FROM Departments AS D OUTER APPLY fn_getsubtree(D.dep_m_id) AS ST轉載于:https://www.cnblogs.com/Dlonghow/archive/2009/07/18/1526298.html
總結
以上是生活随笔為你收集整理的SQL Server 2005参考:Apply运算符的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 连体双胞胎成功分离:虚拟技术立天功
- 下一篇: (SQL语句)按指定时间段分组统计