Précédent   Forum des professionnels en informatique > Bases de données > Langage SQL
Langage SQL Forum d'entraide sur le langage SQL et sur les questions liées à la conception de schéma (DDL). Cours SQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 13/01/2012, 08h31   #1
Membre actif
 
Avatar de xess91
 
Homme
Inscription : octobre 2008
Messages : 407
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 29
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : octobre 2008
Messages : 407
Points : 160
Points : 160
Par défaut Requête - Cas pratique pas si évident

Bonjour à tous,

Voici le problème:

J'ai une table qui contient 3 colonnes: id name parentId
Elle contient:
Citation:
id | name | parentId
1 | n1 | 2
2 | n2 | 4
3 | n3 |
4 | n4 | 7
5 | n5 | 3
6 | n6 | 3
7 | n7 |
Le but était de faire une auto-jointure pour récupérer les branches (les parents ou enfants) d'une entrée avec par exemple avec comme clause where id = 1.

On peut constater l'abre suivant:

Citation:
n7 -> n4 -> n2 -> n1
avec la clause where id = 3, on peut constater l'arbre suivant qui a deux branches:

Citation:
-> n6
n3
-> n5
Mais ça ne fonctionne pas le script s'arrête à une entrée. Comment arriver à se résultat en sql? Est-ce possible de faire ça sans faire une fonction récursive qui envoie des requêtes sql?

Merci à tous pour votre aide .
xess91 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/01/2012, 09h08   #2
Expert Confirmé
 
Homme
Inscription : mai 2002
Messages : 1 654
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 29
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : mai 2002
Messages : 1 654
Points : 2 656
Points : 2 656
Bonjour,

La recurssion c'est par ici : http://sqlpro.developpez.com/cours/s...te-recursives/

Ensuite, selon votre SGBD, vous pouvez avoir d'autre méthode.
punkoff est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/01/2012, 10h15   #3
Expert Confirmé Sénior
 
Homme François
Chef de projet NTIC
Inscription : janvier 2007
Messages : 5 353
Détails du profil
Informations personnelles :
Nom : Homme François
Âge : 51
Localisation : France

Informations professionnelles :
Activité : Chef de projet NTIC

Informations forums :
Inscription : janvier 2007
Messages : 5 353
Points : 9 747
Points : 9 747
Bonjour

Quel est votre SGBD ?

Si c'est Oracle, la solution réside dans ce type de requête :

Code :
1
2
3
4
5
6
7
     SELECT connect_by_isleaf, 
           level, 
           id, 
           idParent
      FROM theTable
          start WITH id = THEFIRSTID
            connect BY prior idParent = id;
Notez les pseudo-colonne connect_by_isleaf et level.
Notez aussi que connect by prior idParent = id n'est pas identique à connect by prior id= idParent (on fait l'affectation dans un sens ou l'autre suivant qu'on veut parcourir vers les parents ou vers les enfants).
__________________

Je ne réponds pas aux questions techniques par MP ! Le forum est là pour ça...


Une réponse vous a aidé ? utiliser le bouton

"L’ennui dans ce monde, c’est que les idiots sont sûrs d’eux et les gens sensés pleins de doutes". B. Russel
Bluedeep est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/01/2012, 10h20   #4
Expert Confirmé Sénior
 
Homme François
Chef de projet NTIC
Inscription : janvier 2007
Messages : 5 353
Détails du profil
Informations personnelles :
Nom : Homme François
Âge : 51
Localisation : France

Informations professionnelles :
Activité : Chef de projet NTIC

Informations forums :
Inscription : janvier 2007
Messages : 5 353
Points : 9 747
Points : 9 747
Citation:
Envoyé par punkoff Voir le message
Bonjour,

La recurssion c'est par ici : http://sqlpro.developpez.com/cours/s...te-recursives/
Il n'y a pas une légére erreur dans le titre ? je ne connais aucune version de Sql Server qui s'appelle Sql Server 2003.
__________________

Je ne réponds pas aux questions techniques par MP ! Le forum est là pour ça...


Une réponse vous a aidé ? utiliser le bouton

"L’ennui dans ce monde, c’est que les idiots sont sûrs d’eux et les gens sensés pleins de doutes". B. Russel
Bluedeep est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/01/2012, 10h48   #5
Expert Confirmé
 
Homme
Inscription : mai 2002
Messages : 1 654
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 29
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : mai 2002
Messages : 1 654
Points : 2 656
Points : 2 656
Bonjour,

Demandez à SQLPro vu que c'est lui qui a fait l'article.
Le contenu, lui, est intéressant et applicable à de nombreux SGBD
punkoff est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/01/2012, 10h51   #6
Expert Confirmé Sénior
 
Homme François
Chef de projet NTIC
Inscription : janvier 2007
Messages : 5 353
Détails du profil
Informations personnelles :
Nom : Homme François
Âge : 51
Localisation : France

Informations professionnelles :
Activité : Chef de projet NTIC

Informations forums :
Inscription : janvier 2007
Messages : 5 353
Points : 9 747
Points : 9 747
Bonjour,

Citation:
Envoyé par punkoff Voir le message
Demandez à SQLPro vu que c'est lui qui a fait l'article.
Pas la peine, car c'est un détail et, de plus, il va passer par là tôt ou tard.

Citation:
Le contenu, lui, est intéressant et applicable à de nombreux SGBD
Tout à fait, mais il existe sur Oracle une autre solution utilisant des instructions spécifiques, comme je le mentionne supra.

De ce fait il serait intéressant que le PO mentionne le SGBD utilisé.
__________________

Je ne réponds pas aux questions techniques par MP ! Le forum est là pour ça...


Une réponse vous a aidé ? utiliser le bouton

"L’ennui dans ce monde, c’est que les idiots sont sûrs d’eux et les gens sensés pleins de doutes". B. Russel
Bluedeep est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/01/2012, 15h40   #7
Membre actif
 
Avatar de xess91
 
Homme
Inscription : octobre 2008
Messages : 407
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 29
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : octobre 2008
Messages : 407
Points : 160
Points : 160
Merci pour vos réponses je vais les étudier. Gros oublie de ma part la base de données c'est MySql!
xess91 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/01/2012, 15h42   #8
Expert Confirmé
 
Homme
Inscription : mai 2002
Messages : 1 654
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 29
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : mai 2002
Messages : 1 654
Points : 2 656
Points : 2 656
Tout ceci n'est pas supporté par MySql.
punkoff est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/01/2012, 15h47   #9
Expert Confirmé Sénior
 
Homme François
Chef de projet NTIC
Inscription : janvier 2007
Messages : 5 353
Détails du profil
Informations personnelles :
Nom : Homme François
Âge : 51
Localisation : France

Informations professionnelles :
Activité : Chef de projet NTIC

Informations forums :
Inscription : janvier 2007
Messages : 5 353
Points : 9 747
Points : 9 747
Citation:
Envoyé par xess91 Voir le message
Merci pour vos réponses je vais les étudier. Gros oublie de ma part la base de données c'est MySql!
Ah la ça va être plus dur. Les réponses données considéraient un "vrai" SGBD.
__________________

Je ne réponds pas aux questions techniques par MP ! Le forum est là pour ça...


Une réponse vous a aidé ? utiliser le bouton

"L’ennui dans ce monde, c’est que les idiots sont sûrs d’eux et les gens sensés pleins de doutes". B. Russel
Bluedeep est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/01/2012, 16h13   #10
Membre actif
 
Avatar de xess91
 
Homme
Inscription : octobre 2008
Messages : 407
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 29
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : octobre 2008
Messages : 407
Points : 160
Points : 160
Effectivement,

Grâce à vos réponses j'ai effectuer des recherches dans google avec certain mots clés comme: "connect by prior" ou encore "requête récursive".

Tout ce que je trouve se ressemble...c'est pas possible avec Mysql
xess91 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/01/2012, 16h20   #11
Expert Confirmé
 
Homme
Inscription : mai 2002
Messages : 1 654
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 29
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : mai 2002
Messages : 1 654
Points : 2 656
Points : 2 656
Vous pourrez surement vous en sortir grace à une procedure stockée par contre.

Où gérer ca dans votre code applicatif si vous n'avez pas trop de volumétrie..
(Sinon il existe des versions gratuite d'autre SGBD qui font tout ceci : PostGreSql, Oracle, SQLServeur, DB2, ..)
punkoff est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 19h17.


 
 
 
 
Partenaires

Hébergement Web