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

Đệ quy trên truy vấn cơ sở dữ liệu để nhận kết quả phân cấp bằng Hibernate - Java

Không thực hiện tra cứu đệ quy trong Java. Điều đó sẽ không mở rộng quy mô bởi vì bạn sẽ gửi rất nhiều truy vấn đến cơ sở dữ liệu. Sử dụng một truy vấn đệ quy (đơn) trực tiếp trên cơ sở dữ liệu sẽ hoạt động và mở rộng quy mô tốt hơn nhiều.

Bạn không chỉ định DBMS của mình nhưng các truy vấn đệ quy được hỗ trợ bởi tất cả các cơ sở dữ liệu hiện đại. Sau đây là ANSI SQL chuẩn:

with recursive ancestry as (
   select child, parent, 1 as level
   from users
   where parent = 'Grandfather' -- this is the one who logs in
   union all
   select c.child, c.parent, p.level + 1
   from users c
     join ancestry p on p.child = c.parent
)
select child, level
from ancestry
order by level desc;

Ví dụ:http://rextester.com/TJGTJ95905

Chỉnh sửa sau khi cơ sở dữ liệu thực sự được tiết lộ.

Trong Oracle, bạn có hai cách để làm điều đó.

Cách "truyền thống" là sử dụng connect by đó là một dạng truy vấn đệ quy nhỏ gọn hơn nhiều so với những gì tiêu chuẩn SQL đưa ra:

select child, level
from users
start with parent = 'Grandfather'
connect by prior child = parent
order by level desc;

Bạn có thể cũng sử dụng một biểu thức bảng chung trong Oracle. Tuy nhiên, mặc dù tiêu chuẩn SQL yêu cầu từ khóa recursive là bắt buộc, Oracle đã chọn bỏ qua phần đó của tiêu chuẩn, vì vậy bạn phải loại bỏ nó. LEVEL là một cột giả trong Oracle chỉ có thể được sử dụng cùng với connect by vì vậy điều này không thể được sử dụng trong giải pháp CTE:

with ancestry (child, parent, lvl) as (
   select child, parent, 1 as lvl
   from users
   where parent = 'Grandfather'
   union all
   select c.child, c.parent, p.lvl + 1
   from users c
     join ancestry p on p.child = c.parent
)
select child, lvl
from ancestry
order by lvl desc



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Thứ tự của các bảng được tham chiếu trong mệnh đề ON của hàm JOIN có quan trọng không?

  2. Truy cập bảng của người dùng khác trong Quy trình được lưu trữ của Oracle

  3. Giá trị khác nhau được tính trên cùng một cột

  4. ES miễn phí cho ngày phát hành 11.2.0.4 và 12.2

  5. có thể có trình tạo chuỗi chữ và số trong sql không