Lời giải thích trong câu trả lời của Krokodilko đơn giản là sai. Bạn có thể bỏ qua dấu "Câu trả lời đúng" và vô số phiếu tán thành, nó vẫn sai. Điều thú vị là anh ấy đã để lại như một bài tập chính xác là trường hợp chứng minh lời giải thích là sai.
CONNECT BY
truy vấn không hoạt động "như thể" bảng mới (hoặc tập hợp hàng đầu ra mới của SELECT
câu lệnh, dù sao) được tạo ở mỗi bước. Đây là sai lầm trong lập luận.
Đúng hơn, chỉ có một tập hợp hàng được tạo tổng thể (qua tất cả các bước). Đúng là các hàng mới được thêm vào dựa trên các hàng được tạo ở bước trước đó; nhưng bản thân bộ hàng là một và đang phát triển, không phải bộ hàng riêng biệt.
Điều này đặc biệt liên quan đến ROWNUM
. ROWNUM
được gán cho các hàng trong một tập hợp hàng "kết quả", bắt đầu bằng 1. Trong CONNECT BY
truy vấn, chỉ có một bộ hàng và ROWNUM
đi từ 1 đến n theo một trình tự tăng dần.
Nếu câu trả lời của Krokodilko là đúng, thì ROWNUM
sẽ khởi động lại ở 1 ở mỗi bước. Rõ ràng đây không phải là trường hợp:hãy thử nó trên một truy vấn phân cấp "chuẩn".
select empno, ename, mgr, level, rownum
from scott.emp
start with mgr is null
connect by prior empno = mgr
;
EMPNO ENAME MGR LEVEL ROWNUM
---------- ---------- ---------- ---------- ----------
7839 KING 1 1
7566 JONES 7839 2 2
7788 SCOTT 7566 3 3
7876 ADAMS 7788 4 4
7902 FORD 7566 3 5
7369 SMITH 7902 4 6
7698 BLAKE 7839 2 7
7499 ALLEN 7698 3 8
7521 WARD 7698 3 9
7654 MARTIN 7698 3 10
7844 TURNER 7698 3 11
7900 JAMES 7698 3 12
7782 CLARK 7839 2 13
7934 MILLER 7782 3 14