2009-09-18 28 views
5

Tôi có một mối quan hệ cha-con trong một Oracle 9i cơ sở dữ liệu bảngoracle 9i có thành viên cao nhất của cây với con cho

như:

parent | child 
1  | 2 
2  | 3 
2  | 4 
null | 1 
1  | 8 

tôi cần để có được phụ huynh tuyệt đối từ một định đứa trẻ. Nói rằng, tôi có con 4, nó phải cho tôi cha mẹ: 1

Tôi đã xem xét CONNECT BY, nhưng tôi không thể tìm ra giải pháp.

+0

Vì vậy, bạn muốn các mẹ cuối cùng , không phải tất cả các liên kết giữa? –

+0

vâng, đúng vậy. Tôi hiện không ở thời gian chạy bao nhiêu cấp. – jwdehaan

Trả lời

4

bạn có thể sử dụng một CONNECT BY truy vấn để xây dựng danh sách của cha mẹ và sau đó lọc:

SQL> WITH tree AS (
    2  SELECT 1 parent_id, 2 child_id FROM DUAL 
    3  UNION ALL SELECT 2 , 3 FROM DUAL 
    4  UNION ALL SELECT 2 , 4 FROM DUAL 
    5  UNION ALL SELECT null, 1 FROM DUAL 
    6  UNION ALL SELECT 1 , 8 FROM DUAL 
    7 ) 
    8 SELECT child_id 
    9 FROM (SELECT * 
10   FROM tree 
11   CONNECT BY PRIOR parent_id = child_id 
12   START WITH child_id = 4) 
13 WHERE parent_id IS NULL; 

    CHILD_ID 
---------- 
     1 
0
SELECT parent 
FROM (
     SELECT parent 
     FROM (
       SELECT parent, level AS l 
       FROM mytable 
       START WITH 
         child = 4 
       CONNECT BY 
         child = PRIOR parent 
       ) 
     ORDER BY 
       l DESC 
     ) 
WHERE rownum = 1 

Điều này sẽ cung cấp cho bạn NULL làm cha mẹ tuyệt đối.

Nếu bạn muốn 1, thay thế parent với child:

SELECT child 
FROM (
     SELECT child 
     FROM (
       SELECT child, level AS l 
       FROM mytable 
       START WITH 
         child = 4 
       CONNECT BY 
         child = PRIOR parent 
       ) 
     ORDER BY 
       l DESC 
     ) 
WHERE rownum = 1 
+0

Tôi cần cha mẹ tuyệt đối, không có số lượng được xác định trước. – jwdehaan

+0

Truy vấn này cung cấp cho cha mẹ tuyệt đối ('NULL' là trường hợp này). Nếu bạn muốn '1', chỉ cần thay thế' parent' bằng 'child' trong truy vấn ở trên. – Quassnoi

Các vấn đề liên quan