Początkowo nie widziałem bardziej eleganckiego rozwiązania niż stworzenie tymczasowej tabeli.
Zastanawiałem się, co to za niezręczny dialekt SQL Oracle:
- Dlaczego nie JEŚLI TABELA ISTNIEJE USUŃ TABELĘ?
- Dlaczego muszę wykonać polecenie WYKONAJ NATYCHMIAST z ciągiem? Dlaczego nie mogę po prostu samodzielnie wykonać DROP TABLE TEMP?
- Dlaczego nie mogę użyć polecenia ORDER BY bez zagnieżdżania w nawiasach w ANCHOR?
- Dlaczego nie mogę mieć ORDER BY przy rekurencyjnym SELECT po UNION ALL?
- SQL Z wymaga standaryzacji. Inne dialekty bazy danych nie wymagają umieszczania nazw kolumn w nawiasach w instrukcji WITH. Jeśli tego nie zrobisz, pojawi się jakiś bezsensowny błąd ALIAS w punkcie łączenia rekurencyjnego po UNION ALL.
- Paginacja:zobacz tutaj BEZ LIMITU / PRZESUNIĘCIA
DECLARE v_c NUMBER;BEGINSELECT COUNT(*) INTO v_c FROM user_tables WHERE TABLE_NAME ='TEMP';IF v_c =1 THEN NATYCHMIASTOWE WYKONANIE 'DROP TABLE TEMP';END IF;END;CREATE TABLE TEMP AS (SELECT * FROM ( WYBIERZ JOBMST_ID, JOBMST_NAME, JOBMST_PRNTID, JOBMST_TYPE FROM TIDAL.JOBMST GDZIE JOBMST_PRNTID NIE JEST NULL ORDER BY JOBMST_PRNTID, JOBMST_NAME)); JOBMST_NAME, JOBMST_PRNTID, JOBMST_TYPE, 1 FROM TIDAL.JOBMST GDZIE JOBMST_PRNTID JEST ZAMÓWIENIEM NULL WEDŁUG JOBMST_NAME )UNION ALLSELECT J2.JOBMST_ID, J2.JOBMST_NAME, J2.JOBMST_PRNTID, J2ST. =J1.JOBMST_IDGDZIE J2.JOBMST_PRNTID NIE JEST NULL)GŁĘBOKOŚĆ WYSZUKIWANIA NAJPIERW WEDŁUG JOBMST_ID SET DISP_SEQSELECT *FROM J1ORDER BY DISP_SEQ;
Następnie (mathguy na Oracle Community Forum) wskazał mi, że moja GŁĘBOKOŚĆ WYSZUKIWANIA powinna być właśnie przy JOBMST_NAME.
Wtedy wszystko się układa: