site:enseignement:master:bdle:tmes:sqlrecursif
Différences
Ci-dessous, les différences entre deux révisions de la page.
Les deux révisions précédentesRévision précédenteProchaine révision | Révision précédente | ||
site:enseignement:master:bdle:tmes:sqlrecursif [09/12/2016 09:29] – amann | site:enseignement:master:bdle:tmes:sqlrecursif [19/10/2017 11:06] (Version actuelle) – hubert | ||
---|---|---|---|
Ligne 1: | Ligne 1: | ||
+ | {{indexmenu_n> | ||
+ | |||
====== SQL et récursion ====== | ====== SQL et récursion ====== | ||
- | + | ||
===== Connexion Oracle ===== | ===== Connexion Oracle ===== | ||
- | [[http:// | + | <del>[[http:// |
+ | |||
+ | [[site: | ||
+ | Quelques liens intéressants: | ||
+ | * [[https:// | ||
===== Chargement de Données ===== | ===== Chargement de Données ===== | ||
Ligne 30: | Ligne 37: | ||
---- | ---- | ||
- | **Question 2**: Affichez tous les noeuds atteignables à partir du noeud 1 et la longueur des chemins. Ensuite, affichez également les chemins (SYS_CONNECT_BY_PATH). | + | **Question 2**: Exécutez |
+ | <code sql> | ||
+ | SELECT DISTINCT target, level, SYS_CONNECT_BY_PATH(SOURCE, | ||
+ | FROM myedges | ||
+ | START WITH SOURCE=1 | ||
+ | CONNECT BY prior target=SOURCE; | ||
+ | </ | ||
---- | ---- | ||
- | **Question 3**: Affichez tous les pairs de noeuds dans G et la longueur des chemins entre eux (il faut utiliser CONNECT_BY_ROOT). Triez le résultats sour les attributs source et target. Ensuite, affichez également les chemins. | + | **Question 3**: Affichez tous les pairs de noeuds dans G et la longueur des chemins entre eux (il faut utiliser |
---- | ---- | ||
- | **Question 4**: Insérez les deux arcs suivants et évaluez à nouveaux les requêtes précédentes (il faudra ajouter le mot clé NOCYCLE après CONNECT BY): | + | **Question 4**: Insérez les deux arcs suivants et évaluez à nouveaux les requêtes précédentes (il faudra ajouter le mot clé [[https:// |
<code SQL> | <code SQL> | ||
Ligne 48: | Ligne 61: | ||
---- | ---- | ||
- | **Question 5**: Affichez tous les pairs de noeuds dans G et la longueur des chemins entre eux ainsi l' | + | **Question 5**: Affichez tous les pairs de noeuds dans G et la longueur des chemins entre eux ainsi l' |
Ligne 57: | Ligne 70: | ||
---- | ---- | ||
**Question 7**: Affichez pour chaque noeud le nombre de cycles. | **Question 7**: Affichez pour chaque noeud le nombre de cycles. | ||
+ | |||
+ | ---- | ||
+ | ***Question 8**: Exécutez la requête suivante et analysez le résultat. Changez la stratégie de parcours (DEPTH FIRST, BREADTH FIRST) et l' | ||
+ | <code SQL> | ||
+ | with R2(source, | ||
+ | as ( | ||
+ | | ||
+ | union all | ||
+ | | ||
+ | ) | ||
+ | search breadth first by source set o1 | ||
+ | cycle target set end to 1 default 0 | ||
+ | select * from R2 | ||
+ | order by o1; | ||
+ | </ | ||
+ | |||
+ | |||
+ | |||
+ | ---- | ||
+ | **Question 9**: Ecrivez une requête qui retourne tous les pairs de noeuds et la longueur du plus court chemin. | ||
+ | |||
Ligne 76: | Ligne 110: | ||
Par défaut le graphe est dirigé (e.g on stocke dans Edges seulement les arcs a → b sans stocker aussi les arcs b → a). | Par défaut le graphe est dirigé (e.g on stocke dans Edges seulement les arcs a → b sans stocker aussi les arcs b → a). | ||
- | ===== Questions | + | ==== Questions ==== |
---- | ---- | ||
Ligne 94: | Ligne 128: | ||
---- | ---- | ||
**Question 3** : | **Question 3** : | ||
- | Donnez les noms des utilisateurs atteignables à une distance donnée à partir de l' | + | Donnez |
+ | |||
+ | Essayez la requête pour plusieurs distances (pour distance 2 vérifiez que vous obtenez le même résultat que pour la question 2). | ||
- | Donnez une solution avec une requête hiérarchique (clause CONNECT BY) et une version récursive (clause WITH). Le graphe est considéré comme étant dirigé. | ||
Résultat: 52 lignes pour la profondeur 2 | Résultat: 52 lignes pour la profondeur 2 | ||
+ | |||
+ | ---- | ||
+ | **Question 3.1** : La question 3 avec une requête récursive (clause WITH). | ||
+ | |||
---- | ---- | ||
**Question 4** : | **Question 4** : | ||
- | Affichez tous les chemins de longueur inférieure ou égale à une distance donnée entre ' | + | Affichez tous les chemins de longueur inférieure ou égale à une distance donnée entre ' |
- | Même question en utilisant une requête récursive (clause WITH). Pour construire le chemin on peut concaténer deux chaînes de caractères en utilisant | ||
Résultat: 13 lignes pour profondeur< | Résultat: 13 lignes pour profondeur< | ||
---- | ---- | ||
- | **Question 4.1** : combien | + | **Question 4.1** : Question 4 en utilisant une requête récursive (clause WITH et sans CONNECT_BY). Pour construire le chemin on peut concaténer deux chaînes |
+ | ---- | ||
+ | **Question 4.2** : Au lieu d' | ||
+ | |||
+ | < | ||
+ | SET autotrace trace stat | ||
+ | </ | ||
+ | |||
+ | Exécutez la requête précédente (ou d' | ||
+ | |||
+ | Explications : | ||
+ | |||
+ | Avant de conteinuer, il faut faire: | ||
+ | < | ||
+ | SET autotrace off | ||
+ | </ | ||
---- | ---- | ||
**Question 5** : | **Question 5** : | ||
- | Donnez une requête qui affiche, pour les utilisateurs ' | + | Donnez une requête qui affiche, pour les utilisateurs ' |
Résultat: 154 lignes | Résultat: 154 lignes | ||
+ | |||
+ | ---- | ||
+ | **Question 5.1**: Question 5 en utilisant | ||
---- | ---- | ||
Ligne 130: | Ligne 187: | ||
<code SQL> | <code SQL> | ||
- | Create VIEW edges_view(usr, | + | Create VIEW edges_view(usr, |
+ | SELECT usr, neighbor FROM edges | ||
+ | UNION ALL | ||
+ | SELECT neighbor, | ||
+ | ); | ||
</ | </ | ||
Ligne 141: | Ligne 202: | ||
Résultat: 34 | Résultat: 34 | ||
+ | |||
+ | ---- | ||
+ | ***Question 8bis**: Calculez l' | ||
---- | ---- | ||
Ligne 192: | Ligne 256: | ||
+ | ===== Mandelbrot en SQL récursif ===== | ||
- | + | Téléchargez le fichier [[http:// | |
- | + | ||
+ | <code SQL> | ||
+ | -- Mandelbrot set visualization in SQL for Oracle | ||
+ | -- | ||
+ | -- Ported to Oracle from the PostgreSQL version https:// | ||
+ | -- Author: Luca.Canali@cern.ch, | ||
+ | -- | ||
+ | -- Additional references: | ||
+ | -- http:// | ||
+ | -- https:// | ||
+ | -- https:// | ||
+ | -- https:// | ||
+ | -- http:// | ||
+ | -- | ||
+ | -- Tested on Oracle (SQL*plus) 11.2.0.4 for Linux using Putty as terminal emulator | ||
+ | -- | ||
+ | |||
+ | -- Oracle SQL*plus page setup and formatting parameters | ||
+ | set verify off | ||
+ | set lines 250 | ||
+ | set pages 999 | ||
+ | |||
+ | -- Configuration parameters for the Mandelbrot set calculation | ||
+ | -- Edit to change the region displayed and/or resolution by changing the definitions here below | ||
+ | -- Edit your terminal screen resolution and/or modify XPOINTS and YPOINTS so that the image fits the screen | ||
+ | define XMIN=-2.0 | ||
+ | define YMIN=-1.4 | ||
+ | define XMAX=0.5 | ||
+ | define YMAX=1.4 | ||
+ | define XPOINTS=150 | ||
+ | define YPOINTS=80 | ||
+ | define XSTEP=" | ||
+ | define YSTEP=" | ||
+ | |||
+ | -- Visualization parameters | ||
+ | define PALETTESTRING=" | ||
+ | define MAXITER=" | ||
+ | define ESCAPE_VAL=4 | ||
+ | |||
+ | WITH | ||
+ | XGEN AS ( -- X dimension values generator | ||
+ | SELECT CAST(& | ||
+ | YGEN AS ( -- Y dimension values generator | ||
+ | SELECT CAST(& | ||
+ | Z(IX, IY, CX, CY, X, Y, I) AS ( -- Z point iterator. Makes use of recursive common table expression | ||
+ | SELECT IX, IY, X, Y, X, Y, 0 FROM XGEN, YGEN | ||
+ | UNION ALL | ||
+ | SELECT IX, IY, CX, CY, X*X - Y*Y + CX, 2*X*Y + CY, I+1 FROM Z WHERE X*X + Y*Y < & | ||
+ | | ||
+ | SELECT IX, IY, MAX(I) AS VAL FROM Z -- VAL=MAX(I) represents how quickly the values reached the escape point | ||
+ | GROUP BY IY, IX) | ||
+ | SELECT LISTAGG(SUBSTR('& | ||
+ | FROM MANDELBROT_MAP | ||
+ | GROUP BY IY | ||
+ | ORDER BY IY DESC; | ||
+ | </ | ||
+ | |||
+ | © [[http:// | ||
site/enseignement/master/bdle/tmes/sqlrecursif.1481272178.txt.gz · Dernière modification : de amann