Bagaimanakah CTE Rekursif Berjalan, Baris demi Baris?
CTE Rekursif, seperti UNION ALL yang tidak berkesudahan, terdiri daripada huruf asas dan berbilang panggilan rekursif. Pertimbangkan perkara berikut:
WITH rows AS ( SELECT * FROM mytable WHERE anchor_condition ), rows2 AS ( SELECT * FROM set_operation(mytable, rows) ), rows3 AS ( SELECT * FROM set_operation(mytable, rows2) ), … SELECT * FROM rows UNION ALL SELECT * FROM rows2 UNION ALL SELECT * FROM rows3 UNION ALL …
Dalam contoh yang disediakan:
WITH abcd1 AS ( SELECT * FROM @tbl t WHERE ParentId IS NULL ), abcd2 AS ( SELECT t.* FROM abcd1 JOIN @tbl t ON t.ParentID = abcd1.id ), abcd3 AS ( SELECT t.* FROM abcd2 JOIN @tbl t ON t.ParentID = abcd2.id ), abcd4 AS ( SELECT t.* FROM abcd3 JOIN @tbl t ON t.ParentID = abcd3.id ), abcd5 AS ( SELECT t.* FROM abcd4 JOIN @tbl t ON t.ParentID = abcd4.id ), abcd6 AS ( SELECT t.* FROM abcd5 JOIN @tbl t ON t.ParentID = abcd5.id ) SELECT * FROM abcd1 UNION ALL SELECT * FROM abcd2 UNION ALL SELECT * FROM abcd3 UNION ALL SELECT * FROM abcd4 UNION ALL SELECT * FROM abcd5 UNION ALL SELECT * FROM abcd6
Setiap lelaran penambat menghasilkan panggilan rekursif baharu, mencipta satu set lapisan bersarang. Sauh dipanggil sekali, berfungsi sebagai titik permulaan. Lelaran seterusnya menggunakan hasil panggilan sebelumnya untuk mengisi ahli rekursif.
Memandangkan abcd6 tidak mengembalikan hasil, ia membayangkan keadaan berhenti. Secara teorinya, CTE rekursif boleh menjadi tidak terhingga, tetapi SQL Server menguatkuasakan had untuk menghalang set rekod tak terhingga.
Rujuk artikel berikut untuk mendapatkan cerapan lanjut:
Atas ialah kandungan terperinci Bagaimanakah CTE Rekursif Melaksanakan Langkah demi Langkah?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!