Diğer programlama dillerinden SQL'e gelince, özyinelemeli bir sorgunun yapısı oldukça garip görünüyor. Adım adım ilerleyin ve parçalanıyor gibi görünüyor.
Aşağıdaki basit örneği düşünün:
CREATE TABLE #NUMS
(N BIGINT);
INSERT INTO #NUMS
VALUES (3), (5), (7);
WITH R AS
(
SELECT N FROM #NUMS
UNION ALL
SELECT N*N AS N FROM R WHERE N*N < 10000000
)
SELECT N FROM R ORDER BY N;
Hadi içinden geçelim.
İlk olarak, bağlantı elemanı yürütülür ve sonuç kümesi R'ye yerleştirilir. Bu nedenle R, {3, 5, 7} olarak başlatılır.
Ardından, yürütme BİRLİĞİ TÜMÜ altına düşer ve özyinelemeli üye ilk kez yürütülür. R üzerinde yürütülür (yani, şu anda elimizde bulunan R üzerinde: {3, 5, 7}). Bu, {9, 25, 49} ile sonuçlanır.
Bu yeni sonuçla ne işe yarıyor? Mevcut {3, 5, 7} 'ye {9, 25, 49} ekliyor, sonuçta ortaya çıkan sendika R'yi etiketliyor ve ardından oradan tekrarlamaya devam ediyor mu? Yoksa R'yi sadece bu yeni sonuç {9, 25, 49} olarak yeniden tanımlıyor ve daha sonra bütün birleşme mi yapıyor?
Her iki seçim de mantıklı değil.
R şimdi {3, 5, 7, 9, 25, 49} ise ve özyinelemenin bir sonraki yinelemesini gerçekleştirirsek, o zaman {9, 25, 49, 81, 625, 2401} ile sonuçlanır ve kayıp {3, 5, 7}.
R artık sadece {9, 25, 49} ise, yanlış etiketleme sorunumuz var. R, sabitleme elemanı sonuç kümesinin ve müteakip tüm özyinelemeli üye sonuç kümelerinin birleşimi olarak anlaşılır. Oysa {9, 25, 49}, R'nin sadece bir bileşenidir. Şimdiye kadar biriktirdiğimiz R'nin tamamı değildir. Bu nedenle, özyinelemeli üyeyi R'den seçim olarak yazmak mantıklı değildir.
@Max Vernon ve @Michael S.'nin aşağıda ayrıntılarıyla neler sunduğunu kesinlikle takdir ediyorum. Yani, (1) tüm bileşenler özyineleme sınırına veya null kümeye kadar oluşturulur ve sonra (2) tüm bileşenler bir araya getirilir. Bu aslında çalışmak için SQL özyineleme anlamak.
SQL'i yeniden tasarlıyor olsaydık, belki daha açık ve açık bir sözdizimi uygulardık, şöyle bir şey:
WITH R AS
(
SELECT N
INTO R[0]
FROM #NUMS
UNION ALL
SELECT N*N AS N
INTO R[K+1]
FROM R[K]
WHERE N*N < 10000000
)
SELECT N FROM R ORDER BY N;
Matematikte endüktif bir kanıt gibi.
Şu anda olduğu gibi SQL özyineleme ile ilgili sorun, kafa karıştırıcı bir şekilde yazılmış olmasıdır. Yazılma şekli, her bileşenin R arasından seçilerek oluşturulduğunu söyler, ancak bu, şimdiye kadar inşa edilmiş (veya inşa edilmiş gibi görünüyor) tam R anlamına gelmez. Sadece önceki bileşen anlamına gelir.