APPLY'ı kullanma

Tablo değerli gerektiðinde APPLY işleç sağlar işlev dış tablo ifade bir sorgu tarafından döndürülen her satır için.tablo değerli işlev sağ giriş olarak davranır ve dış tablo ifade sol giriş olarak davranır.Doğru giriş, sol giriş gelen her satır için değerlendirilir ve son çıktı için oluşturulan satırları bir araya getirilir.APPLY işletmeni tarafından oluşturulan sütun listesi küme ardından doğru girişi tarafından döndürülen sütunlar listesi giriş sol sütun.

Not

APPLY'ı kullanmak için , veritabanını uyumluluk düzey 90 en az olmalıdır.

APPLY'ın iki biçimi vardır: Çapraz APPLY ve OUTER APPLY. APPLY bir sonuç üreten dış tablodan yalnızca satır döndürür küme tablo değerli işlevi.Bir sonuç üreten iki satır OUTER APPLY'ı verir küme ve tablo değerli işlev tarafından üretilen sütunlardaki NULL değerleri olan bulunmayan satırlar.

Örneğin, aşağıdaki tablolarda, göz önünde bulundurun. Employees ve 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)
);
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);

Çoğu bölümleri, Departments tablonuz karşılık gelen bir çalışan için bir yönetici KIMLIĞI Employees TABLO. Aşağıdaki tablo değerli işlev bir çalışan KIMLIĞI bağımsız değişken olarak kabul eder ve bu çalışan ve tüm kendi düzeyindekilerin döndürür.

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

Tüm düzeyindekilerin yöneticisinin her bölüm için tüm düzeyler geri dönmek için aşağıdaki sorgu kullanın.

SELECT D.deptid, D.deptname, D.deptmgrid
    ,ST.empid, ST.empname, ST.mgrid
FROM Departments AS D
    CROSS APPLY fn_getsubtree(D.deptmgrid) AS ST;

Here is the result set.

deptid      deptname   deptmgrid   empid       empname    mgrid       lvl
----------- ---------- ----------- ----------- ---------- ----------- ---
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

Fark her satırdan Departments Tablo olarak döndürülen satırları gibi birçok kez yineleniyor fn_getsubtree departmanın yöneticisini.

Ayrıca, Gardening Departman görünmüyor sonuçlar. Bu bölüm, yok bir Yöneticisi olduğundan fn_getsubtree boş bir iade küme onun için. Kullanarak OUTER APPLY, Gardening bölüm null değer içeren de sonuç kümesinde görüntülenir deptmgrid aynı zamanda tarafından döndürülen alanlarındaki olarak alanının fn_getsubtree.

See Also

Other Resources