Cách chuẩn SQL để triển khai các truy vấn đệ quy, như được triển khai, ví dụ:của IBM DB2 và SQL Server, là WITH
mệnh đề. Xem bài viết này để biết một ví dụ về dịch CONNECT BY
thành một WITH
(về mặt kỹ thuật là CTE đệ quy ) - ví dụ dành cho DB2 nhưng tôi tin rằng nó cũng sẽ hoạt động trên SQL Server.
Chỉnh sửa:dường như người truy vấn ban đầu yêu cầu một ví dụ cụ thể, đây là một ví dụ từ trang IBM có URL mà tôi đã cung cấp. Cho một bảng:
CREATE TABLE emp(empid INTEGER NOT NULL PRIMARY KEY,
name VARCHAR(10),
salary DECIMAL(9, 2),
mgrid INTEGER);
ở đâu mgrid
tham chiếu đến empid
của người quản lý của một nhân viên , nhiệm vụ là lấy tên của tất cả những người báo cáo trực tiếp hoặc gián tiếp cho Joan
. Trong Oracle, đó là một CONNECT
đơn giản :
SELECT name
FROM emp
START WITH name = 'Joan'
CONNECT BY PRIOR empid = mgrid
Trong SQL Server, IBM DB2 hoặc PostgreSQL 8.4 (cũng như trong tiêu chuẩn SQL, cho những gì đáng giá;-), giải pháp hoàn toàn tương đương thay vào đó là một truy vấn đệ quy (cú pháp phức tạp hơn, nhưng trên thực tế, thậm chí còn mạnh mẽ và linh hoạt hơn ):
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
của Oracle mệnh đề trở thành SELECT
lồng nhau đầu tiên , trường hợp cơ sở của đệ quy, là UNION
ed với phần đệ quy chỉ là một SELECT
khác .
Hương vị cụ thể của SQL Server của WITH
tất nhiên được ghi lại trên MSDN, điều này cũng đưa ra các nguyên tắc và giới hạn cho việc sử dụng từ khóa này, cũng như một số ví dụ.