Oracle
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Oracle

Nhầm lẫn với Oracle CONNECT BY

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à.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Oracle ODP.Net With Entity Framework 6 - Không thể tìm thấy nhà cung cấp tương thích với cơ sở dữ liệu khung Entity

  2. Làm thế nào để lấy tên ngày trong tuần từ một ngày?

  3. tính toán số dư đang chạy trong truy vấn oracle

  4. Cơ sở dữ liệu Oracle BLOB sang InputStream trong Java?

  5. PLS-00428:mệnh đề INTO được mong đợi trong câu lệnh SELECT này