È richiesta l'istruzione SQL ricorsiva ANSI 92
-
10-07-2019 - |
Domanda
Attualmente sto traducendo le istruzioni SQL di SQL Server nel loro equivalente ANSI generico e sono bloccato con un'istruzione ricorsiva che utilizza un'istruzione WITH.
Per concentrarmi sul problema, semplificherò il problema come segue
Se ho due tabelle
-
ReportingUnit
- col1: Key
- col2: ParentReportingUnitKey
-
Struttura
- col1: Key
- col2: ParentReportingUnitKey
Questa struttura sta descrivendo una gerarchia di unità di reporting fino a una struttura, in cui un'unità di reporting può avere 0 .. 1 unità di reporting parent diretto e 0 .. n unità di reporting child.
Una struttura è un record 'foglia', che si collega a un'unità di reporting.
Devo creare un'istruzione SQL valida ANSI 92 (o nella peggiore delle ipotesi che funzionerà su Oracle, DB2 e SQL Server) che restituirà tutte le strutture relative a una determinata unità di reporting in qualsiasi punto della gerarchia.
per es.
- ReportingUnit R1 ha ReportingUnit figli R1.1 e R1.2
- ReportingUnit R1.1 ha figli R1.1.1, R1.1.2
-
L'unità di reporting R1.2 ha figli R1.2.1, R1.2.2
-
L'impianto F1 ha un'unità di reporting principale R1.1.1
- L'impianto F2 ha un'unità di reporting principale R1.1.2
- L'impianto F3 ha un'unità di reporting principale R1.2.1
- L'impianto F4 ha un'unità di reporting principale R1.2.2
Tenendo presente che ci possono essere 0 .. n livelli di ricorsione nella tabella ReportingUnit, come posso restituire tutte e 4 le strutture da un'istruzione SQL dato il parametro ReportingUnit = R1?
Soluzione
Sono tollerabilmente certo che nessuna istruzione ricorsiva fosse disponibile in SQL-92; la prima versione in cui era supportato era SQL-99.
Di conseguenza, sei bloccato con non usare SQL-92. Perché pensi che SQL-92 sia desiderabile? È come un livello base della funzionalità SQL o c'è qualche altro motivo?
Le versioni correnti di DB2 hanno la clausola WITH e possono ottenere query ricorsive. Credo che anche Oracle abbia la clausola WITH; Non sono sicuro se sia possibile ottenere query ricorsive utilizzandole. Oracle ha anche il CONNECT BY PRIOR interamente non standard e non relazionale. Non sono sicuro di cosa supporti MS SQL Server.
Esistono ragionevolmente forti probabilità che non si riesca a trovare un'unica sintassi supportata da tutti e tre i DBMS specificati.
Altri suggerimenti
Non esiste una soluzione SQL-92 per query ricorsive.
L'opzione migliore è usare una delle soluzioni per codificare le relazioni gerarchiche in modo da poter interrogare tutti i discendenti o gli antenati, usando SQL standard.
Consulta una breve descrizione qui: " Qual è il modo più efficiente / elegante per analizzare un tavolo piatto in un albero? " ;.
Oppure leggi " Alberi e gerarchie in SQL per Smarties " di Joe Celko.