เมื่อมาถึง SQL จากภาษาการเขียนโปรแกรมอื่นโครงสร้างของเคียวรีแบบเรียกซ้ำจะค่อนข้างแปลก เดินผ่านทีละขั้นตอนและดูเหมือนว่าจะกระจุย
ลองพิจารณาตัวอย่างง่ายๆดังต่อไปนี้:
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;
ลองเดินดูกัน
ขั้นแรกสมาชิกจุดยึดดำเนินการและชุดผลลัพธ์ถูกใส่ใน R ดังนั้น R จะเริ่มต้นได้ที่ {3, 5, 7}
จากนั้นการดำเนินการจะลดลงต่ำกว่า UNION ALL และสมาชิกแบบเรียกซ้ำจะถูกดำเนินการเป็นครั้งแรก มันรันบน R (นั่นคือบน R ที่เรามีอยู่ในมือ: {3, 5, 7}) ผลลัพธ์นี้ใน {9, 25, 49}
ผลลัพธ์ใหม่นี้ทำอะไรได้บ้าง มันผนวก {9, 25, 49} เข้ากับ {3, 5, 7} ที่มีอยู่แล้ว, ติดฉลาก union R ที่เป็นผลลัพธ์แล้วดำเนินการต่อด้วยการเรียกซ้ำจากที่นั่นหรือไม่? หรือว่าจะกำหนด R เป็นเฉพาะผลลัพธ์ใหม่นี้ {9, 25, 49} และทำสหภาพทั้งหมดในภายหลังหรือไม่
ตัวเลือกทั้งสองไม่สมเหตุสมผล
หาก R คือตอนนี้ {3, 5, 7, 9, 25, 49} และเราดำเนินการวนรอบการเรียกซ้ำครั้งต่อไปเราจะสิ้นสุดด้วย {9, 25, 49, 81, 625, 2401} และเราได้ หายไป {3, 5, 7}
หาก R คือตอนนี้เพียง {9, 25, 49} แสดงว่าเรามีปัญหาการติดฉลากผิด เข้าใจว่าเป็นสหภาพของชุดผลลัพธ์สมาชิกสมอและชุดผลลัพธ์สมาชิกซ้ำทั้งหมดที่ตามมา ในขณะที่ {9, 25, 49} เป็นเพียงส่วนประกอบของ R มันไม่ได้เป็น R เต็มที่เราได้เกิดขึ้น ดังนั้นการเขียนสมาชิกแบบเรียกซ้ำเนื่องจากการเลือกจาก R ไม่สมเหตุสมผล
ฉันขอขอบคุณสิ่งที่ @ Max Vernon และ @Michael S. มีรายละเอียดด้านล่าง กล่าวคือ (1) ส่วนประกอบทั้งหมดถูกสร้างขึ้นจนถึงขีด จำกัด การเรียกซ้ำหรือการตั้งค่าว่างจากนั้น (2) ส่วนประกอบทั้งหมดจะรวมเข้าด้วยกัน นี่คือวิธีที่ฉันเข้าใจการเรียกซ้ำ SQL เพื่อใช้งานได้จริง
ถ้าเราออกแบบ SQL บางทีเราอาจบังคับใช้ไวยากรณ์ที่ชัดเจนและชัดเจนมากขึ้นดังนี้:
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;
ประเภทของการพิสูจน์อุปนัยในคณิตศาสตร์
ปัญหาเกี่ยวกับการเรียกซ้ำ SQL ตามที่เป็นอยู่ในปัจจุบันคือมันถูกเขียนในลักษณะที่สับสน วิธีที่เขียนนั้นบอกว่าส่วนประกอบแต่ละอย่างเกิดจากการเลือกจาก R แต่มันไม่ได้หมายความว่า R แบบเต็มที่ถูกสร้างขึ้น (หรือดูเหมือนจะถูกสร้างขึ้นมา) มันหมายถึงองค์ประกอบก่อนหน้า