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

Tôi có một bảng có cấu trúc như (id, parent_id) trong Oracle11g.

id    parent_id
---------------
1     (null)
2     (null)
3     1
4     3
5     3
6     2
7     2

Tôi muốn truy vấn nó để lấy tất cả các dòng được liên kết phân cấp với mỗi id này, vì vậy kết quả sẽ là:

root_id  id    parent_id
------------------------
1        3     1
1        4     3
1        5     3
2        6     2
2        7     2
3        4     3
3        5     3

Tôi đã vật lộn với connect bystart withkhá lâu rồi, và tất cả những gì tôi có thể nhận được là một phần nhỏ kết quả tôi muốn với các truy vấn như:

select connect_by_root(id) root_id, id, parent_id from my-table
start with id=1
connect by prior id = parent_id

Tôi không muốn sử dụng bất kỳ forvòng lặp nào để có được kết quả hoàn chỉnh của mình.

Bất kỳ ý tưởng ?

Trân trọng, Jérôme Lefrère

Tái bút: đã chỉnh sửa sau câu trả lời đầu tiên, nhận thấy tôi đã quên một số kết quả mà tôi muốn ...

2 hữu ích 0 bình luận 4.1k xem chia sẻ
3

Truy vấn bạn đã đăng thiếu frommệnh đề và để lại dấu gạch dưới connect_by_root, nhưng tôi sẽ cho rằng những điều đó thực sự không phải là nguồn gốc của vấn đề của bạn.

Truy vấn sau cung cấp cho bạn kết quả mà bạn đang tìm kiếm:

select * from (
   select connect_by_root(id) root_id, id, parent_id
   from test1
   start with parent_id is null
   connect by prior id = parent_id)
where root_id <> id

Vấn đề trung tâm là bạn đang chỉ định một giá trị cụ thể để bắt đầu, thay vì chỉ định một cách xác định các hàng gốc. Thay đổi id = 1để parent_id is nullcho phép trả lại toàn bộ nội dung của bảng.

Tôi cũng đã thêm truy vấn bên ngoài để lọc các hàng gốc ra khỏi tập kết quả, không được đề cập trong câu hỏi của bạn, nhưng đã được hiển thị trong kết quả mong muốn của bạn.

Ví dụ về SQL Fiddle


Phản hồi nhận xét:

Trong phiên bản được cung cấp, bạn nhận được hậu duệ của id = 3, nhưng không phải theo cách đó 3là gốc. Điều này là do chúng tôi đang bắt đầu từ gốc tuyệt đối. Giải quyết vấn đề này rất dễ dàng, chỉ cần bỏ qua start withmệnh đề:

SELECT *
FROM
  (SELECT connect_by_root(id) root_id,
          id,
          parent_id
   FROM test1
CONNECT BY
   PRIOR id = parent_id)
WHERE root_id <> id

Ví dụ về SQL Fiddle

3 hữu ích 1 bình luận chia sẻ
2

thử cái này:

select connect_by_root(id) root_id, id, parent_id
from your_table
start with parent_id is null
connect by prior id = parent_id
2 hữu ích 3 bình luận chia sẻ
0

Nó sẽ cung cấp cho bạn kết quả chính xác mà bạn muốn:

select connect_by_root(id) as root, id, parent_id
from test1
connect by prior id=parent_id
start with parent_id is not null;
0 hữu ích 0 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 hierarchical-data , hoặc hỏi câu hỏi của bạn.

Có thể bạn quan tâm

loading