Ban đầu, tôi không thể thấy giải pháp nào thanh lịch hơn là tạo một bảng tạm thời.
Tôi đang nghĩ, một phương ngữ khó xử của SQL Oracle là gì:
- Tại sao không có BẢNG NẾU TỒN TẠI BẢNG XÓA?
- Tại sao tôi phải THỰC HIỆN NGAY LẬP TỨC với một chuỗi? Tại sao tôi không thể tự làm DROP TABLE TEMP?
- Tại sao tôi không thể đặt ORDER BY mà không đặt trong dấu ngoặc đơn trên ANCHOR?
- Tại sao tôi không thể có ORDER BY trên SELECT đệ quy sau khi UNION ALL?
- SQL WITH cần chuẩn hóa. Các phương ngữ cơ sở dữ liệu khác không yêu cầu tên cột được đặt trong ngoặc đơn trên câu lệnh WITH. Nếu bạn không làm điều đó, bạn sẽ gặp một số lỗi ALIAS vô nghĩa, tại điểm nối đệ quy sau UNION ALL.
- Phân trang:Xem tại đây Không có LIMIT / OFFSET
DECLARE
v_c NUMBER;
BEGIN
SELECT COUNT(*) INTO v_c FROM user_tables WHERE TABLE_NAME = 'TEMP';
IF v_c = 1 THEN
EXECUTE IMMEDIATE 'DROP TABLE TEMP';
END IF;
END;
CREATE TABLE TEMP AS (
SELECT * FROM (
SELECT JOBMST_ID, JOBMST_NAME, JOBMST_PRNTID, JOBMST_TYPE
FROM TIDAL.JOBMST
WHERE JOBMST_PRNTID IS NOT NULL
ORDER BY JOBMST_PRNTID, JOBMST_NAME
)
);
WITH J1(JOBMST_ID, JOBMST_NAME, JOBMST_PRNTID, JOBMST_TYPE, LVL) AS (
SELECT * FROM (
SELECT JOBMST_ID, JOBMST_NAME, JOBMST_PRNTID, JOBMST_TYPE, 1
FROM TIDAL.JOBMST
WHERE JOBMST_PRNTID IS NULL
ORDER BY JOBMST_NAME
)
UNION ALL
SELECT J2.JOBMST_ID, J2.JOBMST_NAME, J2.JOBMST_PRNTID, J2.JOBMST_TYPE, J1.LVL + 1
FROM TEMP J2
INNER JOIN J1 ON J2.JOBMST_PRNTID = J1.JOBMST_ID
WHERE J2.JOBMST_PRNTID IS NOT NULL
)
SEARCH DEPTH FIRST BY JOBMST_ID SET DISP_SEQ
SELECT *
FROM J1
ORDER BY DISP_SEQ;
Sau đó, (mathguy trên Diễn đàn Cộng đồng Oracle) đã chỉ ra cho tôi TÌM KIẾM ĐẦU TIÊN của tôi lẽ ra phải là JOBMST_NAME.
Sau đó, tất cả rơi vào vị trí:
WITH J1(JOBMST_ID, JOBMST_NAME, JOBMST_PRNTID, JOBMST_TYPE, LVL) AS (
SELECT JOBMST_ID, JOBMST_NAME, JOBMST_PRNTID, JOBMST_TYPE, 1
FROM TIDAL.JOBMST
WHERE JOBMST_PRNTID IS NULL
UNION ALL
SELECT J2.JOBMST_ID, J2.JOBMST_NAME, J2.JOBMST_PRNTID, J2.JOBMST_TYPE, J1.LVL + 1
FROM TIDAL.JOBMST J2
INNER JOIN J1 ON J2.JOBMST_PRNTID = J1.JOBMST_ID
WHERE J2.JOBMST_PRNTID IS NOT NULL
)
SEARCH DEPTH FIRST BY JOBMST_NAME SET DISP_SEQ
SELECT *
FROM J1
ORDER BY DISP_SEQ