Informações

Autores Quentin Cappart
Prazo de entrega Sem prazo
Limite de submissão No limitation

Entrar

Requêtes SQL récursives

Une requête récursive est une requête SQL qui permet de définir un résultat en fonction de lui-même, afin de traiter des structures hiérarchiques ou répétitives (arbres, graphes, chaînes de dépendances, etc.).

En SQL (notamment SQLite), elle s’écrit généralement avec with recursive et comporte deux parties :

  1. Cas de base (initialisation): une première requête qui produit les lignes de départ.
  2. Partie récursive: une requête qui utilise le résultat déjà construit pour produire de nouvelles lignes. Elle est répétée automatiquement jusqu’à ce qu’aucune nouvelle ligne ne soit ajoutée.

La structure typique d'une requête récursive est la suivante:

with recursive my_relation as (
    -- cas de base
    select ...

    union all

    -- partie récursive
    select ...
    from my_relation
    where ...
)
select *
from my_relation;

Dans notre base de données university, une requête récursive serait par exemple utile pour obtenir la chaîne des prérequis d'un cours (et pas seulement les prérequis directs.). Par exemple, si CS-103 a pour prérequis CS-102 et que CS-102 a pour prérequis CS-101, alors CS-103 a également CS-101 comme prérequis.

Plus d'informations sur les requêtes récursives sont présentes dans l'ouvrage de référence (Section 5.4, Advanced SQL & Recursive queries)


Questão 1:

Sans passer par une requête récursive, afficher tous les prérequis directs de chaque cours (relation prereq)

Questão 2:

Sans passer par une requête récursive, afficher tous les prérequis d'ordre 2 de chaque cours (i.e., les prérequis des prérequis d'un cours). Afficher les attributs course_id et les prérequis d'ordre 2 renommé en prereq_2.

Questão 3:

Sans passer par une requête récursive, afficher tous les prérequis d'ordre 3 de chaque cours. Afficher les attributs course_id et les prérequis d'ordre 3 renommé en prereq_3.

Questão 4:

La difficulté est qu'on ne connaît pas à l'avance quel est l'ordre maximal de la chaîne des prérequis. C'est pourquoi une requête récursive est intéressante dans cette situation. Attention! Un des risques avec des requêtes récursives est d'avoir des cycles, ce qui ne donne aucune condition d'arrêt. C'est malheureusement ce qu'on a dans nos prérequis (entre les cours 133 et 852 par exemple). Pour éviter cela, on peut imposer un ordre limite à l'appel récursif. En pratique ces cycles de pré-requis seraient probablement une erreur de conception dans le cheminement des cours.

Utiliser une requête récursive pour afficher tous les prérequis d'un ordre 1 jusqu'à 10 de chaque cours. Afficher la réponse avec les attributs course_id, prereq_id, ordre (qui correspond à l'ordre du prérequis)