Sqlserver
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Sqlserver

Mô phỏng CONNECT BY PRIOR của Oracle trong SQL Server

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ụ.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Chuyển đổi trong một phân vùng trong SQL Server (T-SQL)

  2. Sử dụng StringWriter để tuần tự hóa XML

  3. Chèn dữ liệu máy chủ SQL vào Salesforce bằng con trỏ

  4. Tại sao máy chủ SQL gặp lỗi này:Không thể chèn giá trị NULL vào cột 'id'?

  5. Cách ORIGINAL_DB_NAME () hoạt động trong SQL Server