Ci-dessous, les différences entre deux révisions de la page.
Les deux révisions précédentes Révision précédente Prochaine révision | Révision précédente | ||
site:enseignement:master:bdle:tmes:sqlrecursif [14/12/2016 12:33] amann |
site:enseignement:master:bdle:tmes:sqlrecursif [19/10/2017 11:06] (Version actuelle) hubert |
||
---|---|---|---|
Ligne 1: | Ligne 1: | ||
+ | {{indexmenu_n>70}} | ||
+ | |||
====== SQL et récursion ====== | ====== SQL et récursion ====== | ||
- | + | ||
===== Connexion Oracle ===== | ===== Connexion Oracle ===== | ||
- | [[http://www-bd.lip6.fr/ens/bdmd2013/index.php/ConnexionOracle]] | + | <del>[[http://www-bd.lip6.fr/ens/bdmd2013/index.php/ConnexionOracle]]</del> |
+ | |||
+ | [[site:enseignement:documentation:oracle:connexionoracle]] | ||
+ | Quelques liens intéressants: | ||
+ | * [[https://docs.oracle.com/cd/B19306_01/server.102/b14200/queries003.htm|Requetes hiérarchiques]] | ||
===== 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 la requête suivante et expliquez ce qu'elle affiche. |
+ | <code sql> | ||
+ | SELECT DISTINCT target, level, SYS_CONNECT_BY_PATH(SOURCE, '/') path | ||
+ | FROM myedges | ||
+ | START WITH SOURCE=1 | ||
+ | CONNECT BY prior target=SOURCE; | ||
+ | </code> | ||
---- | ---- | ||
- | **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 [[https://docs.oracle.com/cd/B14117_01/server.101/b10759/operators004.htm|CONNECT_BY_ROOT]]). Triez le résultats sour les attributs source et target. Ensuite, affichez également les chemins. |
---- | ---- | ||
- | **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://docs.oracle.com/cd/B19306_01/server.102/b14200/queries003.htm|NOCYCLE]] après CONNECT BY): |
<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'information si le chemin est un cycle. | + | **Question 5**: Affichez tous les pairs de noeuds dans G et la longueur des chemins entre eux ainsi l'information si le chemin est un cycle (. |
Ligne 58: | Ligne 71: | ||
**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'attribut utilisé pour la détection du cycle. | ***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'attribut utilisé pour la détection du cycle. | ||
<code SQL> | <code SQL> | ||
- | with R2(a,b,l) | + | with R2(source,target,l) |
as ( | as ( | ||
select source,target,1 from myedges | select source,target,1 from myedges | ||
union all | union all | ||
- | select r.a, m.target, r.l+1 from R2 r, myedges m where m.source=r.b | + | select r.source, m.target, r.l+1 from R2 r, myedges m where m.source=r.target |
) | ) | ||
- | search breadth first by a set o1 | + | search breadth first by source set o1 |
- | cycle a set end to 1 default 0 | + | cycle target set end to 1 default 0 |
select * from R2 | select * from R2 | ||
order by o1; | order by o1; | ||
</code> | </code> | ||
- | --- | + | |
- | ***Question 9**: Ecrivez une requête qui retourne tous les pairs de noeuds et la longueur du plus court chemin. | + | |
+ | ---- | ||
+ | **Question 9**: Ecrivez une requête qui retourne tous les pairs de noeuds et la longueur du plus court chemin. | ||
Ligne 122: | Ligne 137: | ||
---- | ---- | ||
- | **Question 3.1** : La question avec une requête récursive (clause WITH). | + | **Question 3.1** : La question 3 avec une requête récursive (clause WITH). |
Ligne 135: | Ligne 150: | ||
**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 de caractères en utilisant || (Exemple: '/' || chaîne ajoute '/' devant chaîne). | **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 de caractères en utilisant || (Exemple: '/' || chaîne ajoute '/' devant chaîne). | ||
+ | ---- | ||
+ | **Question 4.2** : Au lieu d'exécuter la requête, on veut obtenir des statistiques sur les coûts. Pour cela, il faut exécuter d'abord la commande suivante, avant de reexécuter la requête: | ||
- | **Question 4.2** : Question 4 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 || (Exemple: '/' || chaîne ajoute '/' devant chaîne). | + | <code> |
+ | SET autotrace trace stat | ||
+ | </code> | ||
+ | |||
+ | Exécutez la requête précédente (ou d'autres requêtes) et étudiez les statistiques observées: | ||
+ | |||
+ | Explications :{{https://docs.oracle.com/cd/B10500_01/server.920/a96533/autotrac.htm}} | ||
+ | |||
+ | Avant de conteinuer, il faut faire: | ||
+ | <code> | ||
+ | SET autotrace off | ||
+ | </code> | ||
---- | ---- | ||
**Question 5** : | **Question 5** : | ||
- | Donnez une requête qui affiche, pour les utilisateurs 'Kendall' et 'Baylee' l'identifiant de chaque utilisateur atteignable à une profondeur d'exploration de maximum 3, avec la longueur du plus court chemin vers cet utilisateur (les degrés de séparation entre Kendall ou Baylee et les autres utilisateurs). Donnez une solution en utilisant la clause CONNECT BY. (Indication : utiliser la clause CONNECT_BY_ROOT dans la requête hiérarchique). Même question en utilisant une quête récursive (clause WITH). Le graphe est considéré comme étant dirigé. | + | Donnez une requête qui affiche, pour les utilisateurs 'Kendall' et 'Baylee' l'identifiant de chaque utilisateur atteignable à une profondeur d'exploration de maximum 3, avec la longueur du plus court chemin vers cet utilisateur (les degrés de séparation entre Kendall ou Baylee et les autres utilisateurs). Donnez une solution en utilisant la clause CONNECT BY. (Indication : utiliser la clause CONNECT_BY_ROOT dans la requête hiérarchique). Le graphe est considéré comme étant dirigé. |
Résultat: 154 lignes | Résultat: 154 lignes | ||
+ | |||
+ | ---- | ||
+ | **Question 5.1**: Question 5 en utilisant une quête récursive (clause WITH). | ||
---- | ---- | ||
Ligne 156: | Ligne 187: | ||
<code SQL> | <code SQL> | ||
- | Create VIEW edges_view(usr, neighbor) AS( SELECT usr, neighbor FROM edges UNION ALL SELECT neighbor,usr FROM edges); | + | Create VIEW edges_view(usr, neighbor) AS ( |
+ | SELECT usr, neighbor FROM edges | ||
+ | UNION ALL | ||
+ | SELECT neighbor,usr FROM edges | ||
+ | ); | ||
</code> | </code> | ||
Ligne 167: | Ligne 202: | ||
Résultat: 34 | Résultat: 34 | ||
+ | |||
+ | ---- | ||
+ | ***Question 8bis**: Calculez l'histogramme du graphe Facebook. | ||
---- | ---- |