Share via


Özyinelemeli sorgular ortak tablo ifadeleri kullanma

Ortak bir tablo ifade (cte) kendisi, böylece bir özyinelemeli cte oluşturma başvurusu yapabilmek önemli avantajı sağlar.İlk bir cte tekrar tekrar tam sonuç küme alınana kadar veri alt kümeleri döndürmek için yürütüldüğü bir özyinelemeli cte biridir.

Ne zaman onu bir özyinelemeli cte başvuran bir özyinelemeli sorgulamak için bir sorgu denir.Hiyerarşik veri döndüren bir çok özyinelemeli sorgular, örneğin kullanılır: Kuruluş şeması görüntüleme çalışanları veya bir ürün, ana ürün bir veya daha fazla bileşenleri ve bu bileşenlerin, sırasıyla olabilir malzemeleri senaryonun veri alt bileşenleri sahip veya diğer Ebeveynler bileşenleri olabilir.

Özyinelemeli cte bir seçin, Ekle, update, delete veya create VIEW deyim içinde özyinelemeli sorgu çalıştırmak için gereken kodu büyük ölçüde basitleştirir.Önceki sürümlerinde SQL Serverözyinelenen bir sorgu genellikle gerektirdiği geçici tablolara, İmleçler ve mantık akışını denetlemek için kullanmaözyinelemeli adımları. Ortak tablo ifadeleri hakkında daha fazla bilgi için bkz: Ortak tablo ifadeleri kullanma.

Özyinelemeli cte yapısı

Diğer programlama dillerinde özyinelemeli yordamları Transact-sql içerisinde cte özyinelemeli yapısını benzer.Diğer dillerde bir özyinelemeli yordam, skaler bir değer döndüren olsa da, bir özyinelemeli cte birden çok satır döndürür.

Bir özyinelemeli cte üç öğelerden oluşur:

  1. Yordam çağırma.

    Özyinelemeli cte ilk çağrılmasını biri veya birkaçı oluşur CTE_query_definitions UNION all, BİRLİĞİ, DIŞINDAKİLER, katılan veya KESİŞEN operators.Çünkü bu sorgu tanımlarını form Bankası sonuç küme cte yapısı, bunlar için çapa üyeleri denir.

    CTE_query_definitions cte oldukları sürece bağlantı üye olarak kabul edilir.Tüm bağlama üyesi sorgu tanımlamaları ilk özyinelemeli üye tanım önce yerleştirilmelidir ve UNION all işleç için kullanılan birleştirmek ilk özyinelemeli üye ile son bağlama üyesi.

  2. Özyinelemeli çağırma yordamının.

    Özyinelemeli çağırma birini veya daha fazlasını içeren CTE_query_definitions cte başvuran UNION all operatörleri tarafından katıldı.Bu sorgu tanımlarını özyinelemeli üyeleri denir.

  3. Sonlandırma onay.

    Sonlandırma onay örtülü; hiçbir satır önceki çağırma döndürülen özyineleme durur.

Not

Hatalı oluşan bir özyinelemeli cte sonsuz bir döngüye neden olabilir.Örneğin, üst ve alt sütunlar için aynı değerleri özyinelemeli üye sorgu tanımını verir, sonsuz bir döngüye oluşturulur.Test edilirken sonuçlar özyinelenen bir sorgu'nın MAXRECURSION ipucu ve 0 ile 32.767 arasında bir değer INSERT, update, DELETE seçeneği yan tümce tümce tümcesini kullanarak belirli bir deyim izin özyineleme düzeyi sayısını sınırlayabilirsiniz., veya deyim.Daha fazla bilgi için bkz: Sorgu ipuçları (Transact-sql) ve Common_table_expression (Transact-sql) ile.

Bir yarý semantiği

Özyinelemeli cte yapısı en az birini içermelidir bağlama üyesi ve bir özyinelemeli üye.Bir basit içeren tek bir cte özyinelemeli bileşenleri aşağıdaki yarı kod gösterilir bağlama üyesi ve tek özyinelemeli üye.

WITH cte_name ( column_name [,... n] )

AS

(

CTE_query_definition –- Anchor member is defined.

UNION ALL

CTE_query_definition –- Recursive member is defined referencing cte_name.

)

-- Statement using the CTE

SELECT *

FROM cte_name

semantik Özyinelemeli yürütme aşağıdaki gibidir:

  1. cte bölme ifade tutturucu ve özyinelemeli üyeleri içine.

  2. Çalıştır bağlama üye(s) oluşturma ilk çağırma veya temel sonuç küme (t0).

  3. Özyinelemeli çalıştırmak üye(s) t ilei olarak girdi ve ti + 1 bir çıkış olarak.

  4. Adımı yineleyin 3 kadar boş bir küme döndürülür.

  5. Sonuç küme döndürür.Bu, bir BİRLİĞİ tüm t,0 tn.

Örnek

Aşağıdaki örnekte gösterildiği semantik çalışanlar hiyerarşik listesi döndürerek tarafından özyinelemeli cte yapısı, de en yüksek derecelendirme çalışanı ile başlayan Adventure Works Cycles şirketi.İzlenecek yol kod yürütme örnek aşağıda verilmiştir.

-- Create an Employee table.
CREATE TABLE dbo.MyEmployees
(
    EmployeeID smallint NOT NULL,
    FirstName nvarchar(30)  NOT NULL,
    LastName  nvarchar(40) NOT NULL,
    Title nvarchar(50) NOT NULL,
    DeptID smallint NOT NULL,
    ManagerID int NULL,
 CONSTRAINT PK_EmployeeID PRIMARY KEY CLUSTERED (EmployeeID ASC) 
);
-- Populate the table with values.
INSERT INTO dbo.MyEmployees VALUES 
 (1, N'Ken', N'Sánchez', N'Chief Executive Officer',16,NULL)
,(273, N'Brian', N'Welcker', N'Vice President of Sales',3,1)
,(274, N'Stephen', N'Jiang', N'North American Sales Manager',3,273)
,(275, N'Michael', N'Blythe', N'Sales Representative',3,274)
,(276, N'Linda', N'Mitchell', N'Sales Representative',3,274)
,(285, N'Syed', N'Abbas', N'Pacific Sales Manager',3,273)
,(286, N'Lynn', N'Tsoflias', N'Sales Representative',3,285)
,(16,  N'David',N'Bradley', N'Marketing Manager', 4, 273)
,(23,  N'Mary', N'Gibson', N'Marketing Specialist', 4, 16);
USE AdventureWorks2008R2;
GO
WITH DirectReports (ManagerID, EmployeeID, Title, DeptID, Level)
AS
(
-- Anchor member definition
    SELECT e.ManagerID, e.EmployeeID, e.Title, edh.DepartmentID, 
        0 AS Level
    FROM dbo.MyEmployees AS e
    INNER JOIN HumanResources.EmployeeDepartmentHistory AS edh
        ON e.EmployeeID = edh.BusinessEntityID AND edh.EndDate IS NULL
    WHERE ManagerID IS NULL
    UNION ALL
-- Recursive member definition
    SELECT e.ManagerID, e.EmployeeID, e.Title, edh.DepartmentID,
        Level + 1
    FROM dbo.MyEmployees AS e
    INNER JOIN HumanResources.EmployeeDepartmentHistory AS edh
        ON e.EmployeeID = edh.BusinessEntityID AND edh.EndDate IS NULL
    INNER JOIN DirectReports AS d
        ON e.ManagerID = d.EmployeeID
)
-- Statement that executes the CTE
SELECT ManagerID, EmployeeID, Title, DeptID, Level
FROM DirectReports
INNER JOIN HumanResources.Department AS dp
    ON DirectReports.DeptID = dp.DepartmentID
WHERE dp.GroupName = N'Sales and Marketing' OR Level = 0;
GO

Örnek kod izlenecek yol

  1. Özyinelemeli cte, DirectReports, biri tanımlar bağlama üyesi ve bir özyinelemeli üye.

  2. bağlama üye t temel sonuç küme döndürür0.En yüksek derecelendirme çalışanın şirketteki olmasıdır; diğer bir deyişle, bir yöneticiye rapor bir çalışanı.

    İşte tarafından döndürülen sonuç küme bağlama üye:

    ManagerID EmployeeID Title                         Level
    --------- ---------- ----------------------------- ------
    NULL      1          Chief Executive Officer        0
    
  3. Özyinelemeli üye içinde çalışanın doğrudan subordinate(s) verir bağlama üyesi sonuç küme.Bu bir birleştirmek işlemi tarafından sağlanır Employee Tablo ve DirectReports cte.Özyinelemeli çağırma kurar, cte kendisini bu başvurusudur.cte çalışana göre DirectReports Giriş (ti), birleştirmek (MyEmployees.ManagerID = DirectReports.EmployeeID) çıktı olarak verir (ti + 1), sahip çalışanlar (ti) kendi Yöneticisi olarak.Bu nedenle, ilk tekrarında özyinelemeli üye bu sonuç küme döndürür:

    ManagerID EmployeeID Title                         Level
    --------- ---------- ----------------------------- ------
    1         273        Vice President of Sales       1
    
  4. Özyinelemeli üye art arda devreye girer.The second iteration of the recursive member uses the single-row result set in step 3 (containing EmployeeID273) as the input value, and returns this result set:

    ManagerID EmployeeID Title                         Level
    --------- ---------- ----------------------------- ------
    273       16         Marketing Manager             2
    273       274        North American Sales Manager  2
    273       285        Pacific Sales Manager         2
    

    Özyinelemeli üçüncü tekrarında üye giriş değer olarak yukarıda küme sonuç kullanır ve bu sonuç küme döndürür:

    ManagerID EmployeeID Title                         Level
    --------- ---------- ----------------------------- ------
    16        23         Marketing Specialist          3
    274       275        Sales Representative          3
    274       276        Sales Representative          3
    285       286        Sales Representative          3
    
  5. En son sonuç küme çalışan sorgu tarafından döndürülen tüm birleşimdir sonuç kümesitutturucu ve özyinelemeli üyeleri tarafından üretilen s.

    Örnek tarafından döndürülen tam sonuç küme aşağıdadır:

    ManagerID EmployeeID Title                         Level
    --------- ---------- ----------------------------- ------
    NULL      1          Chief Executive Officer       0
    1         273        Vice President of Sales       1
    273       16         Marketing Manager             2
    273       274        North American Sales Manager  2
    273       285        Pacific Sales Manager         2
    16        23         Marketing Specialist          3
    274       275        Sales Representative          3
    274       276        Sales Representative          3
    285       286        Sales Representative          3