2016-02-11 25 views
7

Truy vấn sau đây cho thấy select * kết hợp với connect byleft join không trả về tất cả các cột, nhưng chỉ sử dụng các cột trong các điều kiện này. Hành vi này hữu ích đối với tôi, vì không được sử dụng select * khi phát hành, nó rất hữu ích khi yêu cầu dữ liệu.Oracle chọn dấu hoa thị kết nối bằng cách tham gia kết hợp sql-92

with t1 as (
    select 1 id, 0 parent, 'ROOT' name from dual 
    union all 
    select 2 id, 1 parent, 'CHILD-1' name from dual 
    union all 
    select 3 id, 1 parent, 'CHILD-2' name from dual 
), t2 as (
    select 1 t1id, 'node' special from dual 
) 
    select * from t1 
    left join t2 on t2.t1id=t1.id 
    start with id = 2 
    connect by prior parent = id; 

trong khi truy vấn khác trả về tất cả các cột

select * from t1 
    start with id = 2 
    connect by prior parent = id; 

    select * from t1 
    left join t2 on t2.t1id=t1.id; 

tôi không thể tìm thấy tài liệu về chức năng này, là có bất kỳ?

+0

'CHỌN t1. *, T2. * 'Công trình.Không biết tại sao 'SELECT *' thì không. – MT0

+0

và thêm 'WHERE name IS NOT NULL AND (đặc biệt IS NULL HOẶC đặc biệt IS NOT NULL)' sau đó sẽ có nghĩa là các cột đó xuất hiện trong 'SELECT *'. – MT0

Trả lời

0

tôi tin rằng các tài liệu bạn đang tìm kiếm có thể tìm thấy ở đây: Hierarchical Queries

Phần phù hợp nhất:

Oracle xử lý các truy vấn thứ bậc như sau:

  • Một tham gia, nếu có, được đánh giá đầu tiên, cho dù tham gia được xác định trong mệnh đề FROM hoặc với các mệnh đề mệnh đề WHERE.

  • Điều kiện CONNECT BY được đánh giá.

  • Bất kỳ vị từ mệnh đề WHERE còn lại nào đều được đánh giá.

Oracle sau đó sử dụng thông tin từ những đánh giá để hình thành hệ thống phân cấp theo các bước sau:

  1. Oracle chọn hàng gốc (s) của hệ thống phân cấp - những hàng đáp ứng START VỚI điều kiện.

  2. Oracle chọn các hàng con của mỗi hàng gốc. Mỗi hàng con phải thỏa mãn điều kiện của điều kiện CONNECT BY đối với một trong các hàng gốc.

  3. Oracle chọn các thế hệ hàng con liên tiếp. Oracle đầu tiên chọn con của các hàng được trả về trong bước 2, và sau đó là con cái của những đứa trẻ đó, v.v. Oracle luôn chọn trẻ em bằng cách đánh giá điều kiện CONNECT BY đối với một hàng cha hiện tại.

  4. Nếu truy vấn chứa mệnh đề WHERE mà không tham gia, thì Oracle sẽ loại bỏ tất cả các hàng khỏi cấu trúc phân cấp không đáp ứng điều kiện của mệnh đề WHERE. Oracle đánh giá điều kiện này cho từng hàng riêng lẻ, thay vì loại bỏ tất cả các con của một hàng không thỏa mãn điều kiện.

  5. Oracle trả về các hàng theo thứ tự như trong Hình 9-1. Trong sơ đồ, trẻ em xuất hiện bên dưới bố mẹ. Để có giải thích về cây phân cấp, xem Hình 3-1, "Cây phân cấp".

0

Không SQL-92, nhưng thực hiện SELECT * + KẾT NỐI BẰNG + LEFT JOIN

WITH t1 AS (
    SELECT 1 ID, 0 PARENT, 'ROOT' NAME FROM dual 
    UNION ALL 
    SELECT 2 ID, 1 PARENT, 'CHILD-1' NAME FROM dual 
    UNION ALL 
    SELECT 3 ID, 1 PARENT, 'CHILD-2' NAME FROM dual 
), t2 AS (
    SELECT 1 t1id, 'node' special FROM dual 
) 
SELECT  * 
FROM  t1, t2 
WHERE t2.t1id(+) = t1.ID 
START WITH ID = 2 
CONNECT BY PRIOR PARENT = ID 
; 
Các vấn đề liên quan