2008-11-06 24 views
5

Tôi đã có một trí nhớ khủng khiếp. Bất cứ khi nào tôi thực hiện truy vấn CONNECT BY trong Oracle - và tôi có nghĩa là mỗi thời gian - Tôi phải suy nghĩ kỹ và thường xuyên thông qua thử nghiệm và lỗi xảy ra trên đối số mà PRIOR sẽ đi.Làm thế nào để tôi nhớ cách nào vòng PRIOR nên đi trong CONNECT BY truy vấn

Tôi không biết tại sao tôi không nhớ - nhưng tôi thì không.

Có ai có thói quen nhớ nhớ tiện dụng để tôi luôn nhớ không?

Ví dụ:

Để đi xuống một cây từ một nút - rõ ràng là tôi phải bất lực nhìn này lên :) - bạn làm điều gì đó như:

select 
    * 
from 
    node 
connect by 
    prior node_id = parent_node_id 
start with 
    node_id = 1 

Vì vậy, - tôi bắt đầu với một node_id của 1 (phía trên cùng của nhánh) và truy vấn tìm kiếm tất cả các nút trong đó parent_node_id = 1 và sau đó lặp lại xuống dưới cùng của cây.

Để đi lên cây trước khi đi vào phụ huynh:

select 
    * 
from 
    node 
connect by 
    node_id = prior parent_node_id 
start with 
    node_id = 10 

Vì vậy, bắt đầu từ đâu đó xuống một chi nhánh (node_id = 10 trong trường hợp này) Oracle đầu tiên được tất cả các nút nơi parent_node_id là giống như một mà node_id là 10.

EDIT: tôi vẫn nhận sai này để nghĩ rằng tôi muốn thêm một chỉnh sửa làm rõ để mở rộng trên answ chấp nhận er - Đây là cách tôi nhớ nó bây giờ:

select 
    * 
from 
    node 
connect by 
    prior node_id = parent_node_id 
start with 
    node_id = 1 

Các 'ngôn ngữ tiếng Anh' phiên bản của SQL này bây giờ tôi đọc như ...

trong nút, bắt đầu với hàng trong mà node_id = 1, hàng tiếp theo được chọn có parent_node_id bằng node_id từ hàng trước đó (trước đó).

EDIT: Quassnoi làm cho một điểm tuyệt vời - theo thứ tự bạn viết SQL làm cho mọi thứ dễ dàng hơn nhiều.

select 
    * 
from 
    node 
start with 
    node_id = 1 
connect by 
    parent_node_id = prior node_id 

này cảm thấy rõ ràng hơn rất nhiều với tôi - "bắt đầu với" mang đến cho hàng đầu tiên được lựa chọn và "kết nối bằng" cung cấp cho các hàng tiếp theo (s) - trong trường hợp này con cái node_id = 1.

Trả lời

1

Hãy suy nghĩ về thứ tự các bản ghi sẽ được chọn: cột liên kết ngược trên mỗi bản ghi phải khớp với cột chuyển tiếp liên kết trên bản ghi TRƯỚC được chọn.

5

tôi luôn cố gắng để đưa các biểu thức trong JOIN 's theo trình tự sau:

joined.column = leading.column 

truy vấn này:

SELECT t.value, d.name 
FROM transactions t 
JOIN 
     dimensions d 
ON  d.id = t.dimension 

thể được điều trị hoặc như "cho mỗi giao dịch, tìm ra tương ứng tên thứ nguyên "hoặc" cho mỗi thứ nguyên, tìm tất cả các giá trị giao dịch tương ứng ".

Vì vậy, nếu tôi tìm kiếm một giao dịch nào đó, tôi đặt những biểu hiện theo trình tự sau:

SELECT t.value, d.name 
FROM transactions t 
JOIN 
     dimensions d 
ON  d.id = t.dimension 
WHERE t.id = :myid 

, và nếu tôi tìm kiếm một kích thước, sau đó:

SELECT t.value, d.name 
FROM dimensions d 
JOIN 
     transactions t 
ON  t.dimension = d.id 
WHERE d.id = :otherid 

Ther cựu truy vấn hầu hết có thể sử dụng quét chỉ mục trước tiên trên (t.id), sau đó bật (d.id), trong khi lần truy cập thứ nhất sẽ quét chỉ mục trước tiên trên (d.id), sau đó trên (t.dimension) và bạn có thể dễ dàng nhìn thấy nó trong truy vấn: biển các cánh đồng ở bên trái.

Các lái xe và bảng điều khiển có thể không phải như vậy rõ ràng trong một JOIN, nhưng nó rõ ràng như một cái chuông cho một truy vấn CONNECT BY: hàng PRIOR đang lái xe, các phi PRIOR được thúc đẩy.

Đó là lý do truy vấn này:

SELECT * 
FROM hierarchy 
START WITH 
     id = :root 
CONNECT BY 
     parent = PRIOR id 

có nghĩa là "tìm tất cả các hàng mà parent là một trao id". Truy vấn này xây dựng một hệ thống phân cấp.

này có thể được xử lý như thế này:

connect_by(row) { 
    add_to_rowset(row); 

    /* parent = PRIOR id */ 
    /* PRIOR id is an rvalue */ 
    index_on_parent.searchKey = row->id; 

    foreach child_row in index_on_parent.search { 
    connect_by(child_row); 
    } 
} 

Và truy vấn này:

SELECT * 
FROM hierarchy 
START WITH 
     id = :leaf 
CONNECT BY 
     id = PRIOR parent 

có nghĩa là "tìm các hàng có id là một trao parent". Truy vấn này xây dựng một chuỗi tổ tiên.

Luôn đặt PRIOR ở phần bên phải của biểu thức.

Hãy suy nghĩ về PRIOR column như một hằng số tất cả các hàng của bạn sẽ được tìm kiếm.

+1

Tôi thích "Luôn đặt TRƯỚC ở phần bên phải của biểu thức" - nó giúp bạn dễ dàng hơn. Cũng đặt "bắt đầu với" ngay từ đầu. –

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