2008-11-24 13 views
1

Je traduis les instructions SQL Server SQL dans leur équivalent générique ANSI actuellement, et je suis bloqué avec une instruction récursive en utilisant une instruction WITH.ANSI 92 Instruction SQL récursive requise

Par souci de se concentrer sur la question, je vais simplifier la question comme suit

Si j'ai deux tables

  1. ReportingUnit

    • col1: Clé
    • col2: ParentReportingUnitKey
  2. Facility

    • col1: Key
    • col2: ParentReportingUnitKey

Cette structure est décrit une hiérarchie des unités d'exploitation jusqu'à une installation, une unité d' peut avoir 0 .. 1 unités déclarantes parentales directes et 0 .. n unités déclarantes enfants.

Une facilité est un enregistrement «feuille» qui lie à une unité de rapport.

J'ai besoin pour élaborer une norme ANSI 92 valide l'instruction SQL (ou au pire un qui fonctionne sur Oracle, DB2 et SQL Server) qui renverra toutes les installations liées à une unité de déclaration donnée partout dans la hiérarchie.

par exemple.

  • ReportingUnit R1 a ReportingUnit enfants R1.1 et R1.2
  • ReportingUnit R1.1 a des enfants R1.1.1, R1.1.2
  • ReportingUnit R1.2 a des enfants R1.2.1, R1 .2.2

  • Facility F1 dispose d'une unité de reporting parent R1.1.1

  • Facility F2 dispose d'une unité de reporting parent R1.1.2
  • Faci lité F3 dispose d'une unité de reporting mère R1.2.1
  • Facility F4 dispose d'une unité de reporting parent R1.2.2

Ayant à l'esprit il y a peut-être 0 .. n niveaux de récursivité dans la table ReportingUnit, comment Je retourne toutes les 4 installations d'une instruction SQL étant donné le paramètre ReportingUnit = R1?

Répondre

3

Je suis assez certain qu'aucune instruction récursive n'était disponible dans SQL-92; la première version où cela était supporté était SQL-99.

Par conséquent, vous n'utilisez pas SQL-92. Pourquoi pensez-vous que SQL-92 est souhaitable? S'agit-il d'un niveau de base de la fonctionnalité SQL ou y a-t-il une autre raison?

Les versions actuelles de DB2 ont la clause WITH et peuvent réaliser des requêtes récursives. Je crois qu'Oracle a aussi la clause WITH; Je ne suis pas sûr qu'il puisse réaliser des requêtes récursives en les utilisant. Oracle dispose également de CONNECT BY PRIOR, totalement non standard et non relationnel. Je ne suis pas sûr de ce que MS SQL Server supporte.

Il existe une probabilité raisonnablement forte que vous ne puissiez pas trouver une seule syntaxe prise en charge par les trois SGBD spécifiés.

2

Il n'existe aucune solution SQL-92 pour les requêtes récursives. La meilleure option consiste à utiliser l'une des solutions de codage des relations hiérarchiques afin de pouvoir interroger tous les descendants ou ancêtres à l'aide du langage SQL standard.

Voir une brève description ici: "What is the most efficient/elegant way to parse a flat table into a tree?".

Ou lire "Trees and Hierarchies in SQL for Smarties" par Joe Celko.

+0

+1. Les ensembles imbriqués sont * la * manière de faire des hiérarchies de profondeur arbitraire en SQL; une clé étrangère parent-row n'est presque jamais une solution utilisable. – bobince

+0

En fait, je préfère la conception de la relation d'adjacence sur les ensembles imbriqués. Et la solution "parent_id" est toujours adéquate (et plus simple) si vous n'avez jamais besoin d'interroger des arbres complets, seulement des enfants immédiats ou des parents. –