Bases de Données / Databases

Site Web de l'équipe BD du LIP6 / LIP6 DB Web Site

Outils pour utilisateurs

Outils du site


site:enseignement:master:bdle:tmes:sqlrecursif

Différences

Ci-dessous, les différences entre deux révisions de la page.

Lien vers cette vue comparative

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 [09/12/2016 12:00]
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 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'​attribut utilisé pour la détection du cycle.
 +<code SQL>
 +with R2(source,​target,​l)
 +as (
 +   ​select source,​target,​1 from myedges
 +   union all
 +   ​select r.source, m.target, r.l+1  from R2 r, myedges m where m.source=r.target
 +)
 +search breadth first by source set o1
 +cycle target set end to 1 default 0
 +select * from R2
 +order by o1;
 +</​code>​
 +
 +
 +
 +----
 +**Question 9**: Ecrivez une requête qui retourne tous les pairs de noeuds et la longueur du plus court chemin.
 +
    
  
Ligne 103: Ligne 137:
  
 ---- ----
-**Question 3.1** : La question avec une requête récursive (clause WITH).+**Question 3.1** : La question ​avec une requête récursive (clause WITH).
  
  
Ligne 116: 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êteset é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 137: 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 148: Ligne 202:
  
 Résultat: 34 Résultat: 34
 +
 +---- 
 +***Question 8bis**: Calculez l'​histogramme du graphe Facebook.
  
 ---- ----
site/enseignement/master/bdle/tmes/sqlrecursif.1481281236.txt.gz · Dernière modification: 09/12/2016 12:00 par amann