Helpex - Trao đổi & giúp đỡ Đăng nhập
16

Tôi có một truy vấn đệ quy thực sự kéo dài giới hạn kiến ​​thức SQL của chú khỉ Java này. Bây giờ cuối cùng cũng là 1:30 sáng, có lẽ đã đến lúc bắt đầu tìm kiếm sự trợ giúp. Đây là một trong số ít lần Google đã làm tôi thất bại.

Bảng như sau:

Parent_ID CHILD_ID QTY
25        26        1
25        27        2
26        28        1
26        29        1
26        30        2
27        31        1
27        32        1
27        33        2

Tôi đang cố gắng để có kết quả sau, trong đó phụ huynh có mọi đứa trẻ được liệt kê bên dưới họ. Lưu ý rằng thác của qty cũng vậy.

BASE    PARENT_ID  CHILD_ID   QTY
25         25        26        1
25         25        27        2
25         26        28        1
25         26        29        1
25         26        30        1
25         27        31        2
25         27        32        2
25         27        33        4
26         26        28        1
26         26        29        1
26         26        30        2
27         27        31        1
27         27        32        1
27         27        33        2

Tôi đã thử một số sai lệch sau đây nhưng không có kết quả.

SELECT *
FROM MD_BOMS
START WITH PARENT_ID is not null
CONNECT BY PRIOR CHILD_ID = PARENT_ID
ORDER BY PARENT_ID, CHILD_ID

Tôi đang sử dụng cơ sở dữ liệu Oracle. Bất kỳ đề xuất, ý tưởng, vv sẽ được đánh giá rất cao. Điều này có vẻ gần gũi, nhưng tôi không chắc liệu đó có phải là thứ tôi đang tìm kiếm hay không: Truy xuất tất cả Trẻ em và Trẻ em của chúng, SQL đệ quy

Dựa trên ( Truy xuất tất cả Trẻ em và Trẻ em của chúng, SQL đệ quy ) Tôi cũng đã thử cách sau nhưng nhận được lỗi "tham chiếu bất hợp pháp của tên truy vấn trong mệnh đề WITH":

with cte as (
    select  CHILD_ID, PARENT_ID, CHILD_ID as head
    from    MD_BOMS
    where   PARENT_ID is not null
    union all
    select  ch.CHILD_ID, ch.PARENT_ID, p.head
    from    MD_BOMS ch
    join    cte pa
    on      pa.CHILD_ID = ch.PARENT_ID
)
select  *
from    cte
16 hữu ích 2 bình luận 53k xem chia sẻ
9

Câu trả lời của @AlexPoole thật tuyệt, tôi chỉ muốn mở rộng câu trả lời của anh ấy với biến thể truy vấn trực quan hơn để tính tổng các giá trị dọc theo một đường dẫn.
Biến thể này dựa trên tính năng bao thanh toán truy vấn con đệ quy , được giới thiệu trong Oracle 11g R2.

with recursion_view(base, parent_id, child_id, qty) as (
   -- first step, get rows to start with
   select 
     parent_id base, 
     parent_id, 
     child_id, 
     qty
  from 
    md_boms

  union all

  -- subsequent steps
  select
    -- retain base value from previous level
    previous_level.base,
    -- get information from current level
    current_level.parent_id,
    current_level.child_id,
    -- accumulate sum 
    (previous_level.qty + current_level.qty) as qty 
  from
    recursion_view previous_level,
    md_boms        current_level
  where
    current_level.parent_id = previous_level.child_id

)
select 
  base, parent_id, child_id, qty
from 
  recursion_view
order by 
  base, parent_id, child_id

Ví dụ SQLFiddle (mở rộng với một hàng dữ liệu để chứng minh công việc với nhiều hơn 2 cấp)

9 hữu ích 5 bình luận chia sẻ
17

Bạn đang ở gần:

select connect_by_root parent_id base, parent_id, child_id, qty
from md_boms
connect by prior child_id = parent_id
order by base, parent_id, child_id;

          BASE  PARENT_ID   CHILD_ID        QTY
    ---------- ---------- ---------- ----------
            25         25         26          1 
            25         25         27          2 
            25         26         28          1 
            25         26         29          1 
            25         26         30          2 
            25         27         31          1 
            25         27         32          1 
            25         27         33          2 
            26         26         28          1 
            26         26         29          1 
            26         26         30          2 
            27         27         31          1 
            27         27         32          1 
            27         27         33          2 

     14 rows selected 

Nhà connect_by_rootđiều hành cung cấp cho bạn cơ sở parent_id.

SQL Fiddle .

Tôi không chắc bạn đang tính toán như thế nào qty. Tôi đoán bạn muốn tổng số đường dẫn đến đứa trẻ, nhưng điều đó không khớp với những gì bạn đã trình bày. Vì vậy, khi bắt đầu, vay mượn rất nhiều từ câu trả lời này , bạn có thể thử một cái gì đó như:

with hierarchy as (
  select connect_by_root parent_id base, parent_id, child_id, qty,
    sys_connect_by_path(child_id, '/') as path
  from md_boms
  connect by prior child_id = parent_id
)
select h.base, h.parent_id, h.child_id, sum(e.qty)
from hierarchy h
join hierarchy e on h.path like e.path ||'%'
group by h.base, h.parent_id, h.child_id
order by h.base, h.parent_id, h.child_id;

     BASE  PARENT_ID   CHILD_ID SUM(E.QTY)
---------- ---------- ---------- ----------
        25         25         26          1 
        25         25         27          2 
        25         26         28          2 
        25         26         29          2 
        25         26         30          3 
        25         27         31          3 
        25         27         32          3 
        25         27         33          4 
        26         26         28          1 
        26         26         29          1 
        26         26         30          2 
        27         27         31          1 
        27         27         32          1 
        27         27         33          2 

 14 rows selected 
17 hữu ích 2 bình luận chia sẻ
loading
Không tìm thấy câu trả lời bạn tìm kiếm? Duyệt qua các câu hỏi được gắn thẻ sql oracle recursion rdms , hoặc hỏi câu hỏi của bạn.

Có thể bạn quan tâm

loading