Cách CONNECT BY
truy vấn được thực thi và đánh giá - từng bước (theo ví dụ).
Giả sử chúng ta có bảng sau và kết nối bằng truy vấn:
select * from mytable;
X
----------
1
2
3
4
SELECT level, m.*
FROM mytable m
START with x = 1
CONNECT BY PRIOR x +1 = x OR PRIOR x + 2 = x
ORDER BY level;
Bước 1:
Chọn các hàng từ bảng mytable
đáp ứng START WITH
điều kiện, gán LEVEL =1 cho tập kết quả trả về:
CREATE TABLE step1 AS
SELECT 1 "LEVEL", X from mytable
WHERE x = 1;
SELECT * FROM step1;
LEVEL X
---------- ----------
1 1
Bước 2
Tăng cấp độ lên 1:
LEVEL = LEVEL + 1
Tham gia tập hợp kết quả được trả về ở bước trước với mytable
sử dụng CONNECT BY
các điều kiện như các điều kiện tham gia.
Trong mệnh đề này PRIOR column-name
đề cập đến tập kết quả được trả về ở bước trước và column-name
đơn giản đề cập đến mytable
bảng:
CREATE TABLE step2 AS
SELECT 2 "LEVEL", mytable.X from mytable
JOIN step1 "PRIOR"
ON "PRIOR".x +1 = mytable.x or "PRIOR".x + 2 = mytable.x;
select * from step2;
LEVEL X
---------- ----------
2 2
2 3
BƯỚC x + 1
Lặp lại # 2 cho đến khi thao tác cuối cùng trả về tập kết quả trống.
Bước 3
CREATE TABLE step3 AS
SELECT 3 "LEVEL", mytable.X from mytable
JOIN step2 "PRIOR"
ON "PRIOR".x +1 = mytable.x or "PRIOR".x + 2 = mytable.x;
select * from step3;
LEVEL X
---------- ----------
3 3
3 4
3 4
Bước 4
CREATE TABLE step4 AS
SELECT 4 "LEVEL", mytable.X from mytable
JOIN step3 "PRIOR"
ON "PRIOR".x +1 = mytable.x or "PRIOR".x + 2 = mytable.x;
select * from step4;
LEVEL X
---------- ----------
4 4
Bước 5
CREATE TABLE step5 AS
SELECT 5 "LEVEL", mytable.X from mytable
JOIN step4 "PRIOR"
ON "PRIOR".x +1 = mytable.x or "PRIOR".x + 2 = mytable.x;
select * from step5;
no rows selected
Bước 5 không trả về hàng nào, vì vậy bây giờ chúng tôi hoàn thiện truy vấn
Bước cuối cùng
UNION ALL
kết quả của tất cả các bước và trả về nó dưới dạng kết quả cuối cùng:
SELECT * FROM step1
UNION ALL
SELECT * FROM step2
UNION ALL
SELECT * FROM step3
UNION ALL
SELECT * FROM step4
UNION ALL
SELECT * FROM step5;
LEVEL X
---------- ----------
1 1
2 2
2 3
3 3
3 4
3 4
4 4
Bây giờ, hãy áp dụng quy trình trên cho truy vấn của bạn:
SELECT * FROM dual;
DUMMY
-----
X
SELECT LEVEL FROM DUAL CONNECT BY rownum>5;
Bước 1
Vì truy vấn không chứa START WITH
, Oracle chọn tất cả các bản ghi từ bảng nguồn:
CREATE TABLE step1 AS
SELECT 1 "LEVEL" FROM dual;
select * from step1;
LEVEL
----------
1
Bước 2
CREATE TABLE step2 AS
SELECT 2 "LEVEL" from dual
JOIN step1 "PRIOR"
ON rownum > 5
select * from step2;
no rows selected
Vì bước cuối cùng không trả về hàng nào nên chúng tôi sẽ hoàn thiện truy vấn của mình.
Bước cuối cùng
SELECT * FROM step1
UNION ALL
SELECT * FROM step2;
LEVEL
----------
1
Phân tích của truy vấn cuối cùng:
select level from dual connect by rownum<10;
Tôi giao cho bạn như một bài tập về nhà.