sql >> Database teknologi >  >> RDS >> Oracle

Rekursiv underforespørgsel med sortering

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:

  1. Hvorfor nej, HVIS TABEL FINDER SLET TABEL?
  2. Hvorfor skal jeg udføre EXECUTE IMMEDIATE med en streng? Hvorfor kan jeg ikke bare lave DROP TABLE TEMP alene?
  3. Hvorfor kan jeg ikke få ORDER BY uden at indlejre i parentes på ANCHOR?
  4. Hvorfor kan jeg ikke have ORDER BY på rekursiv SELECT efter UNION ALL?
  5. 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.
  6. 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Æ


  1. MySQL FLOOR() Funktion – Rund ned til nærmeste heltal

  2. Forskellen mellem NullIf() og IfNull() i SQLite

  3. Sådan opretter du en sekvens, hvis den ikke eksisterer

  4. indtastning af tabelnavn som plsql-parameter