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

Truy vấn con đệ quy với sắp xếp

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ì:

  1. Tại sao không có BẢNG NẾU TỒN TẠI BẢNG XÓA?
  2. 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?
  3. Tại sao tôi không thể đặt ORDER BY mà không đặt trong dấu ngoặc đơn trên ANCHOR?
  4. Tại sao tôi không thể có ORDER BY trên SELECT đệ quy sau khi UNION ALL?
  5. 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.
  6. 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



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Tính năng mới của Oracle 18c:Sửa đổi phân vùng trực tuyến

  2. GROUP BY / nhầm lẫn hàm tổng hợp trong SQL

  3. Tại sao mẫu ngủ đông này số lượng lớn

  4. Cách cài đặt song song ODP.NET 2.111 và ODP.NET 4.112 trong cùng một máy trong khi cả hai đều trỏ đến cùng một máy chủ cơ sở dữ liệu

  5. Tạo lại nút RAC không hợp lệ