La requête récursive de la base de données Oracle est une technologie très utile. La requête récursive est souvent utilisée lors de l'interrogation de données complexes telles que la structure arborescente, la structure organisationnelle, la relation hiérarchique, etc. La requête récursive nous permet d'utiliser une seule instruction SQL pour compléter la requête de l'ensemble de la structure arborescente sans utiliser une logique de boucle complexe pour parcourir niveau par niveau.
Cet article expliquera comment effectuer des requêtes récursives dans Oracle et montrera un exemple pour illustrer comment interroger une simple relation de nœuds.
1. Le principe de la requête récursive
La requête récursive est implémentée sur la base du principe de joindre sa propre table. L'auto-adhésion fait référence au processus de connexion elle-même, et la requête récursive est réalisée par une correspondance cyclique de chaque enregistrement connecté à lui-même.
Dans Oracle, nous devons généralement utiliser une expression publique AVEC RECURSIVE ou CTE (Common Table Expression) pour implémenter des requêtes récursives. Grâce à CTE, nous pouvons créer un ensemble de tables virtuelles pouvant se référencer les unes les autres, simplifiant ainsi le processus de requêtes récursives.
2. Syntaxe de la requête récursive
La syntaxe de base de la requête récursive est la suivante :
AVEC
(
UNION ALL
)
Parmi eux, l'expression publique récursive contient deux parties :
(1) Récursion Sélection initiale de l'expression commune : La sélection initiale est l'endroit où commence la requête récursive, renvoyant un ensemble d'enregistrements qui correspondent aux colonnes définies dans l'expression commune récursive.
(2) La partie récursive de l'expression publique récursive : La partie récursive est un processus de requête récursif, qui élargira progressivement la portée de la requête.
Le corps de la requête récursive est composé d'instructions de requête et est utilisé pour filtrer et afficher les résultats de la requête récursive.
3. Exemple de requête récursive
Ensuite, nous utiliserons un exemple simple pour montrer comment utiliser une requête récursive pour interroger les relations de nœuds.
Dans l'exemple suivant, nous supposons qu'il existe une table de relations entre nœuds avec la structure suivante :
CREATE TABLE node(
id INT PRIMARY KEY,
node_name VARCHAR2(50),
parent_id INT
);
where, id Indique l'identifiant unique du nœud, node_name indique le nom du nœud et parent_id indique l'ID du nœud parent du nœud actuel.
Maintenant, nous voulons interroger tous les nœuds enfants d'un certain nœud. Nous pouvons utiliser une requête récursive pour y parvenir.
Tout d’abord, nous devons trouver un choix initial, c’est là que nous commençons notre requête. Dans cet exemple, nous spécifions l'ID du nœud de requête comme 1 et l'instruction SQL est la suivante :
WITH node_cte(id, node_name, parent_id, level) AS
(
SELECT id, node_name, parent_id, 1 AS level FROM node WHERE id = 1 UNION ALL SELECT n.id, n.node_name, n.parent_id, level + 1 FROM node n, node_cte c WHERE n.parent_id = c.id
)
SELECT * FROM node_cte;
In Dans cet exemple, nous avons créé une expression publique appelée node_cte. Lors de la sélection initiale, nous avons sélectionné l'enregistrement de nœud avec l'ID de nœud 1 et défini son attribut de niveau sur 1.
Dans la partie récursive, nous interrogeons vers le bas étape par étape en connectant notre propre table et l'expression publique actuelle jusqu'à ce que nous trouvions tous les nœuds enfants. Dans la condition de jointure, nous utilisons c.id pour représenter l'ID de nœud du niveau précédent, obtenant ainsi l'effet d'une requête récursive.
finalement, nous utilisons l'instruction SELECT pour afficher les résultats de la requête et obtenir la sortie suivante:
3 petit-enfant1 2 3
4 petit-enfant2 2 3
5 Child2 1 2d6 petit-enfant3 5 3
7 petit-enfant4 5 3
Dans le résultat, nous pouvons voir qu'à partir des nœuds avec l'ID de nœud à 1, vérifiez tous les sous-nœuds, les niveaux augmentent étape par étape.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!