Question

Je traduis actuellement les instructions SQL Server SQL en leurs équivalents génériques ANSI et je suis bloqué par une instruction récursive à l'aide d'une instruction WITH.

Par souci de concentration sur le sujet, je vais le simplifier comme suit

Si j'ai deux tables

  1. Unité de génération de rapports

    • col1: clé
    • col2: ParentReportingUnitKey
  2. Facilité

    • col1: clé
    • col2: ParentReportingUnitKey

Cette structure décrit une hiérarchie d'unités de rapport allant d'une installation à une autre, où une unité de rapport peut avoir 0 .. 1 unité parent directement et 0 .. n unités enfant.

Une installation est un enregistrement "feuille" reliant une unité de rapport.

Je dois créer une instruction SQL valide ANSI 92 (ou au pire une instruction qui fonctionnera sous Oracle, DB2 et SQL Server), qui renverra toutes les installations associées à une unité de rapport donnée, quelque part dans la hiérarchie.

p. ex.

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

  • La facilité F1 a une unité de reporting parent R1.1.1

  • La facilité F2 a une unité déclarante mère R1.1.2
  • La facilité F3 a une unité déclarante mère R1.2.1
  • La facilité F4 a une unité déclarante mère R1.2.2

Gardant à l'esprit qu'il peut y avoir 0 ... n niveaux de récursivité dans la table ReportingUnit, comment puis-je renvoyer les 4 ressources d'une instruction SQL étant donné le paramètre ReportingUnit = R1?

Était-ce utile?

La solution

Je suis à peu près certain qu'aucune instruction récursive n'était disponible dans SQL-92; la version la plus ancienne où cela était supporté était SQL-99.

Par conséquent, vous ne pouvez pas utiliser SQL-92. Pourquoi pensez-vous que SQL-92 est souhaitable? Est-ce un niveau de base de la fonctionnalité SQL ou existe-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 que 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 sais pas ce que MS SQL Server prend en charge.

Il est fort probable que vous ne puissiez pas trouver une syntaxe unique prise en charge par les trois SGBD spécifiés.

Autres conseils

Il n'y a pas de solution SQL-92 pour les requêtes récursives.

La meilleure option consiste à utiliser l'une des solutions de codage des relations hiérarchiques pour pouvoir interroger tous les descendants ou ancêtres à l'aide de la norme SQL.

Voir une brève description ici: Quel est le moyen le plus efficace / élégant d’analyser une table plate dans un arbre? "..

Ou lisez les Arbres et hiérarchies dans SQL pour Smarties " par Joe Celko.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top