Sử dụng CONNECT BY LEVEL dường như trả về quá nhiều hàng khi được thực hiện trên một bảng. Logic đằng sau những gì đang xảy ra?Tại sao CONNECT BY LEVEL trên một bảng trả lại hàng bổ sung?
Giả sử bảng sau:
create table a (id number);
insert into a values (1);
insert into a values (2);
insert into a values (3);
Truy vấn này trả về 12 dòng (SQL Fiddle).
select id, level as lvl
from a
connect by level <= 2
order by id, level
Một hàng cho mỗi trong bảng A với giá trị của cột LVL là 1 và ba cho mỗi trong bảng A nơi LVL cột là 2, ví dụ:
ID | LVL ---+----- 1 | 1 1 | 2 1 | 2 1 | 2 2 | 1 2 | 2 2 | 2 2 | 2 3 | 1 3 | 2 3 | 2 3 | 2
Nó tương đương với này truy vấn, trả về cùng một kết quả.
select id, level as lvl
from dual
cross join a
connect by level <= 2
order by id, level
Tôi không hiểu tại sao các truy vấn này trả về 12 hàng hoặc tại sao có ba hàng LVL là 2 và chỉ có LVL là 1 cho mỗi giá trị của cột ID.
Tăng số lượng các cấp được "kết nối" với 3 returns 13 rows cho mỗi giá trị của ID. 1 nơi LVL là 1, 3 nơi LVL là 2 và 9 nơi LVL là 3. Điều này dường như gợi ý rằng các hàng trả về là số hàng trong bảng A với công suất của giá trị LVL trừ 1.
I sẽ có dù rằng các truy vấn này sẽ được giống như những điều sau đây, trong đó trả 6 hàng
select id, lvl
from (select level as lvl
from dual
connect by level <= 2
)
cross join a
order by id, lvl
các documentation không phải là đặc biệt rõ ràng, đối với tôi, trong việc giải thích những gì sẽ xảy ra. Điều gì đang xảy ra với các quyền hạn này và tại sao hai truy vấn đầu tiên lại không giống như các truy vấn thứ ba?
Liệu chúng ta có một cái gì đó trong MySQL 5, tương đương với điều này? – abhijitcaps