Bạn không cần một phép nối bên trong vào một bảng giả hoặc một hàm phân tích để tạo ra các số hàng; bạn chỉ có thể sử dụng kết nối bằng (và chức năng cấp tương ứng của nó) trên chính bảng, như sau:
WITH tst_dim_ban_selected AS (SELECT 1 ban_key, 'a' cust_fullname, 3 n FROM dual UNION ALL
SELECT 2 ban_key, 'b' cust_fullname, 4 n FROM dual)
-- end of mimicking your table with data in it. See SQL below
SELECT db.ban_key,
db.cust_fullname,
LEVEL row_num
FROM tst_dim_ban_selected db
CONNECT BY LEVEL <= db.n
AND PRIOR db.ban_key = db.ban_key -- assuming this is the primary key
AND PRIOR sys_guid() IS NOT NULL;
BAN_KEY CUST_FULLNAME ROW_NUM
---------- ------------- ----------
1 a 1
1 a 2
1 a 3
2 b 1
2 b 2
2 b 3
2 b 4
Nếu bạn có các cột khác ngoài ban_key trong khóa chính của bảng, bạn cần đảm bảo rằng chúng được bao gồm trong danh sách prior <column> = <column>
của mệnh đề kết nối S. Điều này để kết nối bằng có thể xác định từng hàng duy nhất, có nghĩa là nó lặp lại chỉ qua hàng đó và không lặp lại hàng khác. PRIOR sys_guid() IS NOT NULL
được yêu cầu để ngăn kết nối theo vòng lặp xảy ra.