Cara standar SQL untuk mengimplementasikan kueri rekursif, seperti yang diterapkan mis. oleh IBM DB2 dan SQL Server, adalah WITH
ayat. Lihat artikel ini untuk satu contoh menerjemahkan CONNECT BY
menjadi WITH
(secara teknis CTE rekursif ) -- contohnya adalah untuk DB2 tapi saya yakin ini akan bekerja pada SQL Server juga.
Sunting:tampaknya pertanyaan asli memerlukan contoh spesifik, ini satu dari situs IBM yang URL-nya sudah saya berikan. Diberikan sebuah tabel:
CREATE TABLE emp(empid INTEGER NOT NULL PRIMARY KEY,
name VARCHAR(10),
salary DECIMAL(9, 2),
mgrid INTEGER);
di mana mgrid
mereferensikan empid
manager manajer karyawan , tugasnya adalah, dapatkan nama semua orang yang melapor langsung atau tidak langsung ke Joan
. Di Oracle, itu sederhana CONNECT
:
SELECT name
FROM emp
START WITH name = 'Joan'
CONNECT BY PRIOR empid = mgrid
Di SQL Server, IBM DB2, atau PostgreSQL 8.4 (juga dalam standar SQL, untuk apa nilainya;-), solusi yang setara sempurna adalah kueri rekursif (sintaks yang lebih kompleks, tetapi, sebenarnya, bahkan lebih banyak kekuatan dan fleksibilitas ):
WITH n(empid, name) AS
(SELECT empid, name
FROM emp
WHERE name = 'Joan'
UNION ALL
SELECT nplus1.empid, nplus1.name
FROM emp as nplus1, n
WHERE n.empid = nplus1.mgrid)
SELECT name FROM n
START WITH
Oracle Oracle klausa menjadi SELECT
. bersarang pertama , kasus dasar rekursi, menjadi UNION
ed dengan bagian rekursif yang hanyalah SELECT
.
Rasa khusus SQL Server dari WITH
tentu saja didokumentasikan di MSDN, yang juga memberikan pedoman dan batasan untuk menggunakan kata kunci ini, serta beberapa contoh.