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

SQL Server Tương đương với Oracle 'CONNECT BY PRIOR' và 'ORDER SIBLINGS BY'

Mô phỏng cột LEVEL

Cột mức có thể dễ dàng được mô phỏng bằng cách tăng bộ đếm trong phần đệ quy:

WITH tree (empid, name, level) AS  (
  SELECT empid, name, 1 as level
  FROM emp
  WHERE name = 'Joan'

  UNION ALL

  SELECT child.empid, child.name, parent.level + 1
  FROM emp as child
    JOIN tree parent on parent.empid = child.mgrid
)
SELECT name 
FROM tree;

Mô phỏng order siblings by

Mô phỏng order siblings by phức tạp hơn một chút. Giả sử chúng ta có một cột sort_order xác định thứ tự của các phần tử trên mỗi phụ huynh (không phải thứ tự sắp xếp tổng thể - vì sau đó order siblings sẽ không cần thiết) sau đó chúng ta có thể tạo một cột cung cấp cho chúng ta một thứ tự sắp xếp tổng thể:

WITH tree (empid, name, level, sort_path) AS  (
  SELECT empid, name, 1 as level, 
         cast('/' + right('000000' + CONVERT(varchar, sort_order), 6) as varchar(max))
  FROM emp
  WHERE name = 'Joan'

  UNION ALL

  SELECT child.empid, child.name, parent.level + 1, 
         parent.sort_path + '/' + right('000000' + CONVERT(varchar, child.sort_order), 6) 
  FROM emp as child
    JOIN tree parent on parent.empid = child.mgrid
)
SELECT * 
FROM tree
order by sort_path;

Biểu thức cho sort_path trông rất phức tạp vì SQL Server (ít nhất là phiên bản bạn đang sử dụng) không có chức năng đơn giản để định dạng một số với các số không ở đầu. Trong Postgres, tôi sẽ sử dụng một mảng số nguyên để chuyển đổi thành varchar không cần thiết - nhưng điều đó cũng không hoạt động trong SQL Server.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Làm cách nào để kiểm tra NLS_LANG của máy khách?

  2. OracleType của ROWNUM là gì

  3. Xử lý Null trong hàm Greatest trong Oracle

  4. Làm cách nào để lấy id đã tạo từ một hàng được chèn bằng ExecuteScalar?

  5. Điều chỉnh hiệu suất SQL cho Oracle Many OR vs IN ()