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:
Ç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.
Ö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.
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:
Bağlantı ve özyinelemeli üyeleri CTE ifadeye bölün.
Ilk çağırma veya temel sonucu oluşturma bağlantı üyeleri çalışan küme (T0).
Özyinelemeli üyeleri T ile çalıştırın.i bir giriş ve T i + 1 olarak bir çıkış.
Yineleme adım 3 boş kadar küme döndürülür.
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ı
Özyinelemeli CTE, DirectReports, bir bağlama üyesi ve bir özyinelemeli üye tanımlar.
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
Ö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
Ö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.
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)