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

Chế độ xem Yêu cầu Logic phụ thuộc lẫn nhau:Có thể không có MODEL?

Bạn có thể sử dụng tính toán truy vấn con đệ quy (còn được gọi là CTE đệ quy):

with tmp as (
  select t.*,
    row_number() over (order by t.id) as rn
  from t
),
r (id, n, x, y, rn) as (
  select id, n, 0, 0, rn
  from tmp
  where rn = 1
  union all
  select tmp.id, tmp.n, r.y - 1, (tmp.n * 2) + r.y - 1, tmp.rn
  from r
  join tmp on tmp.rn = r.rn + 1
)
select id, n, x, y
from r
order by rn;

        ID          N          X          Y
---------- ---------- ---------- ----------
         2          0          0          0 
         3          1         -1          1 
         5          1          0          2 
         7          2          1          5 
        11          3          4         10 
        13          5          9         19 
        17          8         18         34 
        19         13         33         59 

SQL Fiddle .

Về cơ bản, nó đi qua các bước thủ công của bạn. Thành viên liên kết là bước thủ công đầu tiên của bạn, thiết lập xy cả về 0 cho hàng đầu tiên. Sau đó thành viên đệ quy thực hiện phép tính mà bạn đã chỉ định. (Bạn không thể tham khảo x mới được tính giá trị khi tính toán y của hàng đó , vì vậy bạn phải lặp lại điều đó dưới dạng (tmp.n * 2) + r.y - 1 ). rn chỉ là giữ cho các hàng được sắp xếp theo ID trong khi giúp tìm hàng tiếp theo dễ dàng hơn - vì vậy bạn có thể tìm rn + 1 thay vì tìm trực tiếp giá trị ID cao nhất tiếp theo.

Không có sự khác biệt đáng kể về hiệu suất với dữ liệu mẫu của bạn, nhưng với một nghìn hàng được thêm vào, mệnh đề mô hình mất khoảng 5 giây và CTE đệ quy mất khoảng 1 giây; với mô hình nghìn hàng khác mất ~ 20 giây và CTE mất ~ 3 giây; với mô hình nghìn hàng khác mất ~ 40 giây và CTE mất ~ 6 giây; và với một nghìn hàng khác (tổng cộng là 4,008) mô hình mất ~ 75 giây và CTE mất ~ 10 giây. (Tôi đã chán khi chờ đợi phiên bản mô hình có nhiều hàng hơn thế; giết nó sau năm phút với 10.000). Tôi thực sự không thể nói điều này sẽ hoạt động như thế nào với dữ liệu thực của bạn, nhưng trên cơ sở đó, nó có thể đáng để thử.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. cách thay thế nhiều chuỗi với nhau trong Oracle

  2. Làm thế nào để truy xuất giá trị hiện tại của một chuỗi oracle mà không tăng nó?

  3. Tôi tiếp tục gặp lỗi trong quy trình của mình giúp thêm khóa học mới và tôi đã đưa các yêu cầu vào phần mô tả

  4. Thêm các bản ghi giá trị 0 vào một truy vấn bằng cách sử dụng các hàm phân tích tích lũy

  5. Làm cách nào để xóa các bản sao khỏi danh sách được phân tách bằng dấu phẩy bằng regex trong Oracle nhưng tôi không muốn các giá trị trùng lặp?