Share via


Kullanarak ortak tablo deyimleri özyinelemeli sorgular

Ortak bir tablo ifade (CTE), böylece bir özyinelemeli CTE oluşturma başvurmak için önemli yararı sağlar.Bir başlangıç CTE art arda kadar tam sonucu subkümes veri döndürmek için yürütüldüğü BIR özyinelemeli CTE birisidir küme alınır.

Sorguda bir özyinelemeli CTE başvurduğu bir özyinelemeli sorgulamaya denir.Hiyerarşik verileri döndüren bir çok özyinelemeli sorgular, örneğin kullanılır: Bir kuruluş şeması görüntüleme çalışanları veya bir ürün, bir ana ürün bir veya daha fazla bileşenleri ve bu bileşenler, sırayla olabilir malzemeleri senaryonun veri alt bileşenleri varsa veya diğer ana bileşenleri olabilir.

Bir özyinelemeli CTE, bir SELECT, INSERT, UPDATE, DELETE veya CREATE VIEW deyim içinde özyinelenen bir sorguyu çalıştırmak için gereken kodu önemli ölçüde basitleştirebilir.' Ün önceki sürümlerinde SQL Server, özyinelemeli adımları akışını denetlemek için geçici tablolar, işaretçileri ve mantık kullanarak özyinelenen bir sorguyu genellikle gerektirir. Sık kullanılan tablo ifadeler hakkında daha fazla bilgi için bkz: Ortak bir tablo ifadeleri kullanma.

Bir özyinelemeli CTE yapısı

Transact-SQL'de CTE özyinelemeli yapısını diğer programlama dillerinde özyinelemeli yordamlar aynıdır.Diğer dillerde bir özyinelemeli yordamına skaler bir değer döndürür, ancak bir özyinelemeli CTE birden çok satır dönebilirsiniz.

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

  1. Çağırma yordamının.

    Ilk başlatılmasını CTE özyinelemeli bir veya daha fazla oluşur. CTE_query_definitions UNION ALL, UNION, birleştirilmiş DıŞıNDA veya işleçlerin KESIŞEN. Bu sorgu tanımlarını temel sonuç formu için küme CTE yapısını, bunlar için bağlantı üye olarak anılır.

    CTE_query_definitions CTE kendisini oldukları sürece, bağlantı üye olarak kabul edilir.Önce ilk özyinelemeli üye tanımını ve UNION ALL işleç ilk özyinelemeli üye son bağlama üyesi katılmak için kullanılması gereken tüm bağlama üyesi sorgu tanımları konumlandırılmalıdır.

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

    Özyinelemeli çağrı aşağıdakilerden bir veya daha fazlasını içerir. CTE_query_definitions CTE kendisini başvuru UNION ALL işleçleriyle katıldı. Bu sorgu tanımlarını özyinelemeli üye olarak anılır.

  3. Sonlandırma denetleyin.

    Sonlandırma onay örtülü, hiçbir satır bir önceki çağırma döndürülmediğinde özyineleme durdurur.

Not

Hatalı oluşan bir özyinelemeli CTE sonsuz bir döngüye neden olabilir.Örneğin, üye özyinelemeli sorgu tanımı üst ve alt sütunlar için aynı değerleri döndürür, sonsuz bir döngüye oluşturulur.Özyinelenen bir sorgu sonuçlarını sınarken, MAXRECURSION ipucu ve 0 ile 32,767 arasında bir değer, INSERT, UPDATE, DELETE ve SELECT deyiminin OPTION yan tümcesini kullanarak, belirli bir deyim için izin özyineleme düzeylerinin sayısını sınırlayabilirsiniz.Daha fazla bilgi için bkz: Sorgu ipuçları (Transact-SQL) ve WITH common_table_expression (Transact-SQL).

Pseudocode ve semantik

Özyinelemeli CTE yapısını en az bir bağlama üyesi bir özyinelemeli üye içermelidir.Aşağıdaki pseudocode CTE tek bir bağlama üyesi ve tek bir özyinelemeli bir üye içeren basit bir özyinelemeli bileşenleri gösterir.

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

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

  1. Bağlantı ve özyinelemeli üyeleri CTE ifadeye bölün.

  2. Ilk çağırma veya temel sonucu oluşturma bağlantı üyeleri çalışan küme (T0).

  3. Özyinelemeli üyeleri T ile çalıştırın.i bir giriş ve T i + 1 olarak bir çıkış.

  4. Yineleme adım 3 boş kadar küme döndürülür.

  5. Sonuç kümesi döndürür.Bu, bir UNION ALL T0 to Tn.

Örnek

Aşağıdaki örnek, çalışanlar, en yüksek sıralamaya çalışan ile başlatma, hiyerarşik listesi döndürerek özyinelemeli CTE yapısının semantik gösterir Adventure Works Cycles Şirket. CTE yürütür ifadenin sonucu sınırlar küme çalışanlara araştırma ve geliştirme grubu.Kod yürütmenin BIR örneklerde örnek aşağıdadır.

Örnek kod adım adım işlem aşamaları

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

  2. Temel bağlama üyesi işlevi küme T neden0.Bu, en yüksek sıralamaya çalışanın şirketteki, diğer bir deyişle, bir yöneticiye rapor çalışan.

    Işte sonucu küme bağlantı üyesince döndürdü:

    ManagerID EmployeeID Title                                   Level
    --------- ---------- --------------------------------------- ------
    NULL      109        Chief Executive Officer                 0
    
  3. Özyinelemeli üye çalışanın bir doğrudan subordinate(s) bağlama üyesi sonucu verir küme.Bu arasında birleştirmek işlemi tarafından sağlanır Employee Tablo ve DirectReports cte. Özyinelemeli çağrı kurar, CTE kendisi bu referanstır.CTE içinde çalışana göre DirectReports giriş olarak (Ti), the birleştirmek (Employee.ManagerID = DirectReports.EmployeeID) (T çıktı verir.i + 1), (T sahip çalışanlarıi) kendi Yöneticisi olarak.Bu nedenle Özyinelemeli üyesinin ilk yinelemenin bu sonuç döndüreceği için küme:

    ManagerID EmployeeID Title                                   Level
    --------- ---------- --------------------------------------- ------
    109       12         Vice President of Engineering           1
    
  4. Özyinelemeli üye sürekli olarak etkinleştirildi.The second iteration of the recursive member uses the single-row result set in step 3 (containing EmployeeID12) as the input value, and returns this result set:

    ManagerID EmployeeID Title                                   Level
    --------- ---------- --------------------------------------- ------
    12        3          Engineering Manager                     2
    

    The third iteration of the recursive member uses the single-row result set above (containing EmployeeID3) as the input value, and returns this result set:

    ManagerID EmployeeID Title                                   Level
    --------- ---------- --------------------------------------- ------
    3         4          Senior Tool Designer                    3
    3         9          Design Engineer                         3
    3         11         Design Engineer                         3
    3         158        Research and Development Manager        3
    3         263        Senior Tool Designer                    3
    3         267        Senior Design Engineer                  3
    3         270        Design Engineer                         3
    

    Özyinelemeli üye dördüncü yinelemenin önceki kullanan küme satır için EmployeeID Değerler 4, 9, 11, 158, 263, 267, ve 270 giriş değeri olarak.

    Boş bir sonuç özyinelemeli üye dönünceye kadar bu işlemi yineler küme.

  5. Nihai sonuç küme çalışan sorgu tarafından döndürülen tüm birleşim küme s bağlantı ve özyinelemeli üyeleri tarafından oluşturulan neden olur.

    Örnek verilen tüm sonuç kümesi aşağıdadır:

    ManagerID EmployeeID Title                                   Level
    --------- ---------- --------------------------------------- ------
    NULL      109        Chief Executive Officer                 0
    109       12         Vice President of Engineering           1
    12        3          Engineering Manager                     2
    3         4          Senior Tool Designer                    3
    3         9          Design Engineer                         3
    3         11         Design Engineer                         3
    3         158        Research and Development Manager        3
    3         263        Senior Tool Designer                    3
    3         267        Senior Design Engineer                  3
    3         270        Design Engineer                         3
    263       5          Tool Designer                           4
    263       265        Tool Designer                           4
    158       79         Research and Development Engineer       4
    158       114        Research and Development Engineer       4
    158       217        Research and Development Manager        4
    (15 row(s) affected)