I starten kunne jeg ikke se en mere elegant løsning end at lave et vikarbord.
Jeg tænkte, hvilken akavet dialekt af SQL Oracle er:
- Hvorfor nej, HVIS TABEL FINDER SLET TABEL?
- Hvorfor skal jeg udføre EXECUTE IMMEDIATE med en streng? Hvorfor kan jeg ikke bare lave DROP TABLE TEMP alene?
- Hvorfor kan jeg ikke få ORDER BY uden at indlejre i parentes på ANCHOR?
- Hvorfor kan jeg ikke have ORDER BY på rekursiv SELECT efter UNION ALL?
- SQL MED skal standardiseres. Andre databasedialekter kræver ikke, at kolonnenavne er sat i parentes på WITH-sætning. Hvis du ikke gør det, får du en meningsløs ALIAS-fejl på tidspunktet for den rekursive join efter UNION ALL.
- Søgning:Se her INGEN LIMIT / OFFSET
DECLARE v_c NUMBER;BEGINSELECT COUNT(*) INTO v_c FROM user_tables WHERE TABLE_NAME ='TEMP';IF v_c =1 SÅ UDFØRES STRAKS 'DROP TABLE TEMP';END IF;END;CREATE TABLE TEMP AS (VÆLG) * FRA (VÆLG JOBMST_ID, JOBMST_NAME, JOBMST_PRNTID, JOBMST_TYPE FRA TIDAL.JOBMST HVOR JOBMST_PRNTID IKKE ER NULLORDER AF JOBMST_PRNTID, JOBMST_NAME ));MED J1(JOBMST_NAME, JOBMST_SELECTID, JOBMST_SELECTID, JOBMST_SELECTID, JOBMST_SELECTID, JOBMST_SELECTID, JOBMST_SELECTID, JOBMST_SELECTID, JOBMST_NAME, JOBMST_NAME, JOBMST_ JOBMST_NAME, JOBMST_PRNTID. =J1.JOBMST_IDWHERE J2.JOBMST_PRNTID ER IKKE NULL)SØGEDYBDE FØRST VED JOBMST_ID SET DISP_SEQSELECT *FRA J1ORDER BY DISP_SEQ;
Så (mathguy på Oracle Community Forum) påpegede for mig, at min SØGEDYBDE FØRST bare skulle have været af JOBMST_NAME.
Så falder det hele på plads:
WITH J1(JOBMST_ID, JOBMST_NAME, JOBMST_PRNTID, JOBMST_TYPE, LVL) AS ( SELECT JOBMST_ID, JOBMST_NAME, JOBMST_PRNTID, JOBMST_TYPE, 1 FRA TIDAL.JOBMST_PRNTID, JOBMST_TYPE, LVL) SELECT JOBMST_SELECTID.2MST. JOBMST_PRNTID, J2.JOBMST_TYPE, J1.LVL + 1FRA TIDAL.JOBMST J2INNER JOIN J1 PÅ J2.JOBMST_PRNTID =J1.JOBMST_IDWHERE J2.JOBMST_PRNTID ER IKKE NULL)SØGNING_NAVN BYT_SETT_EQROM JDISP_SÆ