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

  1. ReportingUnit

    • col1: Key
    • col2: ParentReportingUnitKey
  2. 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?

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top