IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage SQL Discussion :

select sur une liste chaînée


Sujet :

Langage SQL

  1. #1
    Membre habitué
    Inscrit en
    Janvier 2006
    Messages
    161
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 161
    Points : 168
    Points
    168
    Par défaut select sur une liste chaînée
    bonjour à tous,

    je dois modéliser une association 1-N, et j'étais parti sur une liste chaînée avec le modèle suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
     
    CREATE TABLE TableD(
      TableDId BIGINT NOT NULL AUTO_INCREMENT,
      NextTableDId BIGINT,
      ParamD VARCHAR(50),
      PRIMARY KEY(TableDId)
    );
     
    CREATE TABLE TableC(
      TableCId BIGINT NOT NULL AUTO_INCREMENT,
      ParamC VARCHAR(50),
      TableDId BIGINT,
      PRIMARY KEY(TableCId),
      INDEX (TableDId),
      FOREIGN KEY (TableDId)
        REFERENCES TableD (TableDId)
    );
    Mais une de mes associations 1-N risque de contenir un N assez élevé (> 100, ok tout est relatif )... Je pense donc passer sur un modèle classique d'association entre deux tables dans une table séparée :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
     
    CREATE TABLE TableA(
      TableAId BIGINT NOT NULL AUTO_INCREMENT,
      ParamA VARCHAR(50),
      PRIMARY KEY(TableAId)
    );
     
    CREATE TABLE TableB(
      TableBId BIGINT NOT NULL AUTO_INCREMENT,
      ParamB VARCHAR(50),
      PRIMARY KEY(TableBId)
    );
     
    CREATE TABLE TableABAssociation(
      TableAId BIGINT NOT NULL,
      TableBId BIGINT NOT NULL,
      PRIMARY KEY(TableAId, TableBId)
    );
    Mais j'aurais voulu tester le temps que prend la récupération de tous les TableDId correspondants à un TableCId. Et là je coince. J'ai oublié la façon de gérer les select "récursifs". Pour le modèle classique j'utilise la requête suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    SELECT TableBId FROM TableABAssociation WHERE TableAId = 1;
    /* J'ai fait du provisioning avant le select. */
    mais pour les listes chaînées, je ne trouve pas. Avez-vous vu des choses similaires ?
    Pour info, j'utilise mysql version 4.0 embarquée dans debian, mais je suis ouvert à toute base gratuite/open source.

    Merci !

  2. #2
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 770
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 770
    Points : 52 726
    Points
    52 726
    Billets dans le blog
    5
    Par défaut
    la gestion de le récursivité peut se faire de deux manières :
    1) s'il s'agit d'un arbre (une liste chaine est un arbre particulier) alors n'importe quel SGBDR peut traiter cela sans récursivité en adoptant le mode de représentation intervallaire
    2) si votre SGBDR le supporte, vous pouvez utiliser le concept de CTE (common table expression) qui introduit la récursivité de SQL avec des requêtes préalablement composée avec une clause WITH (par exemple MS SQL Server 2005 et son gratuit SQL Server Express 2005)

    Pour le 1) lire l'article que j'ai écrit à ce sujet :
    http://sqlpro.developpez.com/cours/arborescence/

    Pour le 2) lire l'article US que j'ai écrit :
    http://www.sqlservercentral.com/colu...server2005.asp

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

Discussions similaires

  1. Réponses: 3
    Dernier message: 18/07/2011, 17h12
  2. SELECT sur une liste de valeur
    Par Rams7s dans le forum PL/SQL
    Réponses: 8
    Dernier message: 19/05/2011, 15h30
  3. Select sur une liste de table
    Par H.ile dans le forum SQL
    Réponses: 0
    Dernier message: 28/07/2009, 13h54
  4. recuperer selection sur une liste deroulante
    Par skillipo dans le forum Servlets/JSP
    Réponses: 1
    Dernier message: 18/02/2008, 09h17
  5. select sur une liste de clef
    Par Julien666 dans le forum Langage SQL
    Réponses: 3
    Dernier message: 31/10/2007, 18h49

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo