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

Tôi hy vọng tôi có thể giải thích vấn đề đang làm tôi khó hiểu. Tôi có tập dữ liệu phân cấp sau (đây chỉ là tập con gồm 34K bản ghi)

PARENT_ID   CHILD_ID          EXAM
TUDA12802   TUDA12982         N 
TUDA12982   TUDA12984         J    
TUDA12984   TUDA999           J
TUDA12982   TUDA12983         N
TUDA12983   TUDA15322         J
TUDA12983   TUDA15323         J

Đây là một đại diện của cây

TUDA12982 N
- TUDA12984 J
--  TUDA999 J
- TUDA12983 N
--  TUDA15322 J
--  TUDA15323 J

Những gì tôi cần là danh sách tất cả các bản ghi có exam = N và các bản ghi exam = 'J' bên dưới, có thể được lồng vào nhau.

select *
from test1 
connect by prior child_id = parent_id
start with child_id = 'TUDA12982'
order siblings by child_id;

Đưa cho tôi

PARENT_ID      CHILD_ID          EXAM
TUDA12802   TUDA12982         N 
TUDA12982   TUDA12984         J    
TUDA12984   TUDA999           J
TUDA12982   TUDA12983         N
TUDA12983   TUDA15323         J
TUDA12983   TUDA15322         J

Nhưng những gì tôi cần là

TUDA12802   TUDA12982         N 
TUDA12982   TUDA12984         J 
TUDA12984   TUDA999           J

Việc đi ngang cần dừng lại khi tôi gặp bản ghi EXAM = 'N'.

Tôi cần một cái gì đó giống như một điều khoản "dừng với".

select *
from test1 
connect by prior child_id = parent_id
start with child_id = 'TUDA12982'
stop with exam = 'N'
order siblings by child_id;

Điều này có thể giải quyết như thế nào?

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

Robert,

Bạn có thể làm điều này bằng cách thêm "exam = 'J'" vào mệnh đề connect by:

SQL> create table test1(parent_id,child_id,exam)
  2  as
  3  select 'TUDA12802', 'TUDA12982', 'N' from dual union all
  4  select 'TUDA12982', 'TUDA12984', 'J' from dual union all
  5  select 'TUDA12984', 'TUDA999', 'J' from dual union all
  6  select 'TUDA12982', 'TUDA12983', 'N' from dual union all
  7  select 'TUDA12983', 'TUDA15322', 'J' from dual union all
  8  select 'TUDA12983', 'TUDA15323', 'J' from dual
  9  /

Tabel is aangemaakt.

SQL>  select parent_id
  2        , child_id
  3        , exam
  4        , level
  5        , lpad(' ',2*level) || sys_connect_by_path(parent_id||'-'||child_id,'/') scbp
  6     from test1
  7    start with exam = 'N'
  8  connect by prior child_id = parent_id
  9      and exam = 'J'
 10  /

PARENT_ID CHILD_ID  E  LEVEL SCBP
--------- --------- - ------ ----------------------------------------------------------------------
TUDA12802 TUDA12982 N      1   /TUDA12802-TUDA12982
TUDA12982 TUDA12984 J      2     /TUDA12802-TUDA12982/TUDA12982-TUDA12984
TUDA12984 TUDA999   J      3       /TUDA12802-TUDA12982/TUDA12982-TUDA12984/TUDA12984-TUDA999
TUDA12982 TUDA12983 N      1   /TUDA12982-TUDA12983
TUDA12983 TUDA15322 J      2     /TUDA12982-TUDA12983/TUDA12983-TUDA15322
TUDA12983 TUDA15323 J      2     /TUDA12982-TUDA12983/TUDA12983-TUDA15323

6 rijen zijn geselecteerd.

Trân trọng, Rob.

4 hữu ích 1 bình luận chia sẻ
0

Nghe có vẻ giống như một truy vấn đơn giản để nhận được mục được yêu cầu và đó là con 'J' là những gì bạn muốn, vì vậy điều này sẽ không hoạt động:

select *
from test1 
where child_id = 'TUDA12982'
or exam = 'J'
connect by prior child_id = parent_id
start with child_id = 'TUDA12982'
order siblings by child_id;

Tôi không có Oracle nên không thể kiểm tra xem điều đó có hoạt động hay không, nhưng từ những gì tôi hiểu về cú pháp và những gì tôi vừa Googled thì có vẻ như nó sẽ hoạt động.

0 hữu ích 1 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