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

SQL Firebird Discussion :

Obtenir une liste des tables en ordre hierarchique


Sujet :

SQL Firebird

  1. #1
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 043
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 043
    Points : 40 957
    Points
    40 957
    Billets dans le blog
    62
    Par défaut Obtenir une liste des tables en ordre hierarchique
    tout est dans le titre , je sais bien sur obtenir une liste des tables en ordre alpha (c'est même indiqué dans la faq) mais je sèche sur l'ordre hiérarchique (c.a.d. selon leurs relations) , EST-CE POSSIBLE ?

    un exemple volontairement simplifié

    liste de mes tables
    • LESCOMMANDES
    • LIGNESCOMMANDES
    • MESARTICLES
    • MESCLIENTS

    (je veux obtenir ceci)
    1. MESARTICLES
    2. MESCLIENTS
    3. LESCOMMANDES (liée à MESCLIENTS)
    4. LIGNESCOMMANDE (liée à LESCOMMANDES et MESARTICLES)
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  2. #2
    Membre habitué Avatar de neodelphi2007
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    202
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 202
    Points : 179
    Points
    179
    Par défaut


    En supposant, d'une part, que les Tables MESARTICLES et MESCLIENTS n'ont pas de clés étrangéres, et d'autres par que les tables LESCOMMANDES et LIGNESCOMMANDES on des clés étrangéres liées aux deux tables précédentes (selon le modère classique Entité/Relation). J'utiliserai une convention de rédaction des champs (ce que je fais):

    exemple: Table MESCLIENTS
    ID : integer;
    NOM : VARCHAR;
    PRENOM: VARCHAR;

    Table LESCOMMANDES
    ID : INTEGER
    INTITULE : VARCHAR
    ID_MESCLIENTS : INTEGER (Clé étrangére qui pointe sur MESCLIENTS)

    ainsi je peux savoir par cette convention de rédaction des champs, que tout champs dont
    l'intitulé commence par ID_ est une clé étrangére. de plus en supprimant les troix premiers caractéres ont a le nom de la table avec qui ils ont une relation

    un début de piste:

    Tu mets dans une TStringList toutes les tables.
    Les tables qui on des champs qui sont des clé étrangéres, on leur rajoute le nom du champ préfixé par ID_ en les séparant d'un point par exemple.
    Tu les nommes par exemple LESCOMMANDES.MESCLIENTS (on enléve par exemple les troix caractètes ID_ )

    puis on a par ordre alpha:

    LESCOMMANDES.MESCLIENTS
    LIGNESCOMMANDES.LESCOMMANDES
    LIGNESCOMMANDES.MESARTICLES
    MESARTICLES
    MESCLIENT


    On supprime les tables doublons (ici LIGNESCOMMANDES) et on en garde qu'une;
    puis on supprime les champs après le point.

    voici le resultat triée selon leurs relations et alphabétiqument:

    LESCOMMANDES
    LIGNESCOMMANDES
    MESARTICLES
    MESCLIENTS

    Ensuite, je pense que tu veux uniquement un ordre selon leurs relations et non pas alphabetiquement aussi ? Et veux tu que cela se fasse uniquement dans la BDD ou avec le langage (je suppose DELPHI) ?

    je cogiterai une autre fois (il faut prendre en comptes si la table à des clés érangéres ou pas)

    Bonne journée

  3. #3
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 043
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 043
    Points : 40 957
    Points
    40 957
    Billets dans le blog
    62
    Par défaut
    merci de m'avoir lu .

    En fait je pensais à un SQL direct

    ceci me permettant d'obtenir la liste Alpha
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    select distinct RDB$RELATION_NAME from rdb$RELATION_FIELDS
    where RDB$VIEW_CONTEXT is null
      and RDB$SYSTEM_FLAG = 0;
    je reste persuadé qu'il existe un moyen de faire un SQL ou une procédure adHoc pour obtenir ce que je cherche (hors langage de programmation) mais je m'y perds un peu (beaucoup) dans ces tables systèmes
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  4. #4
    Rédacteur
    Avatar de evarisnea
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Juin 2005
    Messages
    1 957
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : Transports

    Informations forums :
    Inscription : Juin 2005
    Messages : 1 957
    Points : 4 384
    Points
    4 384
    Par défaut
    SergioMaster
    puisqu'il est question de représentation arborescente, peut-être le petit papier de sqlpro Gestion d'arbres par représentation intervallaire pourra t'inspirer ?
    voir aussi celui ci Requêtes récursives avec les CTE

  5. #5
    Membre expert
    Avatar de Barbibulle
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    2 048
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 2 048
    Points : 3 342
    Points
    3 342
    Par défaut
    C'est en effet un article très intéressant mais c'est un peu hors sujet, puisqu'il cherche par requête SQL (en interrogeant les tables systèmes) à en extraire le nom des tables (ça il sait le faire) mais surtout les relations (via les déclarations de foreign key).

  6. #6
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 043
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 043
    Points : 40 957
    Points
    40 957
    Billets dans le blog
    62
    Par défaut
    Moi qui croyais avoir affaire a quelque chose de simple
    j'avais déjà lu le très intéressant article sur la gestion des arbres , je me penche sur celui des Requêtes récursives en essayant de l'appliquer ...
    La suite au W.E. prochain ou pendant mes pauses
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  7. #7
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 043
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 043
    Points : 40 957
    Points
    40 957
    Billets dans le blog
    62
    Par défaut
    je ne suis encore que sur un début de solution .

    Cependant , durant mes recherches , j'ai réussi à obtenir au moins un résultat.

    Je me posais la question : Comment obtenir les champs calculés d'une Table ou de Tables et leurs Formules
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    SELECT a.RDB$RELATION_NAME,a.RDB$FIELD_NAME, b.rdb$COMPUTED_SOURCE
    FROM RDB$RELATION_FIELDS a JOIN RDB$FIELDS b ON a.RDB$FIELD_SOURCE=b.RDB$FIELD_NAME
    WHERE <a.RDB$RELATION NAME=matable AND > b.RDB$COMPUTED_SOURCE IS NOT NULL
    peu , peut-être, être inscrit en FAQ ? petit bémol cependant certains de mes champs calculés n'ont pas une formule complète (certainement du a un saut de ligne lors de la creation de la table)

    [edit] rdb$Computed_SOURCE est un Mémo , mon essai , fait avec FlameRobin me renvoyait que la première ligne
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  8. #8
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 043
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 043
    Points : 40 957
    Points
    40 957
    Billets dans le blog
    62
    Par défaut
    obtenir une dépendance des tables

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    SELECT distinct a.RDB$RELATION_NAME AS NOM_TABLE,c.RDB$RELATION_NAME AS LIEE_A
    FROM RDB$RELATION_CONSTRAINTS a JOIN RDB$INDICES b ON (b.RDB$INDEX_NAME=a.RDB$INDEX_NAME)
    JOIN RDB$RELATION_CONSTRAINTS c ON (c.RDB$INDEX_NAME=b.RDB$FOREIGN_KEY)
    WHERE a.RDB$CONSTRAINT_TYPE='FOREIGN KEY'
    je suis sur que des cracks SQL peuvent m'améliorer la requête ?

    il ne me reste plus qu'a comprendre le papier de SQLPro dur les requêtes récursives
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  9. #9
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 043
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 043
    Points : 40 957
    Points
    40 957
    Billets dans le blog
    62
    Par défaut Maintenant je sèche
    Via cette requête , j'obtiens les tables ainsi que leurs relations
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    -- Les tables dépendantes et leur relations
    SELECT distinct a.RDB$RELATION_NAME AS NOM_TABLE,c.RDB$RELATION_NAME AS PARENT,CAST(0 AS smallint) AS NIVEAU 
    FROM RDB$RELATION_CONSTRAINTS a JOIN RDB$INDICES b ON (b.RDB$INDEX_NAME=a.RDB$INDEX_NAME)
    join RDB$RELATION_CONSTRAINTS c on (c.rdb$index_name=b.rdb$foreign_key)
    WHERE a.RDB$CONSTRAINT_TYPE='FOREIGN KEY'
    union
    -- toutes les tables 
    SELECT DISTINCT RDB$RELATION_NAME,NULL,-1 FROM rdb$RELATION_FIELDS
    WHERE RDB$VIEW_CONTEXT IS NULL
      AND RDB$SYSTEM_FLAG = 0
    par contre , après, je bloque . Les requêtes récursives de SQLPro, oui mais comment ?
    pas de WITH pour Firebird , mais dans une procédure je peux m'en passer en créant une ou des tables (temporaires ou non @Makowski) cependant , à force d'essayer, je ne vois plus rien ... des idées ?
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  10. #10
    Expert éminent sénior
    Avatar de Cl@udius
    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2006
    Messages
    4 878
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Février 2006
    Messages : 4 878
    Points : 10 008
    Points
    10 008
    Par défaut
    Citation Envoyé par SergioMaster Voir le message
    pas de WITH pour Firebird, ...
    Si tu fais allusion au CTE (Common Table Expressions), si cela existe depuis la V2.1.

    @+

  11. #11
    Membre expert

    Homme Profil pro
    Consultant spécialité Firebird
    Inscrit en
    Mai 2002
    Messages
    2 342
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France

    Informations professionnelles :
    Activité : Consultant spécialité Firebird
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 342
    Points : 3 712
    Points
    3 712
    Par défaut
    Citation Envoyé par SergioMaster Voir le message
    par contre , après, je bloque . Les requêtes récursives de SQLPro, oui mais comment ?
    pas de WITH pour Firebird , mais dans une procédure je peux m'en passer en créant une ou des tables (temporaires ou non @Makowski) cependant , à force d'essayer, je ne vois plus rien ... des idées ?
    J'ai la flemme de chercher, mais si tu me dis comment tu fais via une procedure (même avec table temporaraire) je pourrais essayer de te le traduire en CTE
    Philippe Makowski
    IBPhoenix - Firebird
    Membre de l'April

  12. #12
    Membre expert

    Homme Profil pro
    Consultant spécialité Firebird
    Inscrit en
    Mai 2002
    Messages
    2 342
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France

    Informations professionnelles :
    Activité : Consultant spécialité Firebird
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 342
    Points : 3 712
    Points
    3 712
    Par défaut
    ça va ça ?

    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
    SELECT NOM_TABLE, LIST(TRIM(PARENT)) AS LIEE_A
    FROM
    (
    SELECT R.RDB$RELATION_NAME AS NOM_TABLE,D.PARENT 
    FROM RDB$RELATIONS R
    LEFT JOIN 
    (SELECT A.RDB$RELATION_NAME ,c.RDB$RELATION_NAME AS PARENT
    FROM RDB$RELATION_CONSTRAINTS a 
     JOIN RDB$INDICES b ON (b.RDB$INDEX_NAME=a.RDB$INDEX_NAME)
     JOIN RDB$RELATION_CONSTRAINTS c ON (c.rdb$index_name=b.rdb$foreign_key)
    WHERE a.RDB$CONSTRAINT_TYPE='FOREIGN KEY') D 
    on R.RDB$RELATION_NAME=D.RDB$RELATION_NAME 
    WHERE R.RDB$RELATION_TYPE=0 AND R.RDB$SYSTEM_FLAG=0 
    )
    GROUP BY 1
    Philippe Makowski
    IBPhoenix - Firebird
    Membre de l'April

  13. #13
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 043
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 043
    Points : 40 957
    Points
    40 957
    Billets dans le blog
    62
    Par défaut
    @Cl@udius damned !! pour des raisons indépendantes de ma volonté je reste , pour l'instant, bloqué à la version 2.0

    @makowski hum!! je teste ça , LIST ? pourquoi pas mais version 2.1 non ?
    de plus je crois qu'il y a risque de "bouclage" en cas de référence "circulaire"
    en exemple : j'ai une table d'unité de mesure
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    CREATE TABLE UNITES
    (
      UNITE CHARUP3 NOT NULL,
      LIBELLE_UNITE Varchar(20),
      UNITE_CONVERSION Char(3),
      FORMULE_1 Varchar(30),
      FORMULE_2 Varchar(30),
      CONSTRAINT CLE1_UNITE PRIMARY KEY (UNITE)
    );
     
    ALTER TABLE UNITES ADD CONSTRAINT UNITE_EXISTE
      FOREIGN KEY (UNITE_CONVERSION) REFERENCES UNITES (UNITE)
    ce qui se rapproche le plus de LIST c'est
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    SELECT A.NOM_TABLE,A.PARENT,B.PARENT,C.PARENT,D.PARENT,E.PARENT,F.PARENT
    FROM LESTABLES A LEFT JOIN LESTABLES B ON A.PARENT=B.NOM_TABLE AND B.PARENT<>B.NOM_TABLE
                     LEFT JOIN LESTABLES C ON B.PARENT=C.NOM_TABLE AND C.PARENT<>C.NOM_TABLE
                     LEFT JOIN LESTABLES D ON C.PARENT=D.NOM_TABLE AND D.PARENT<>D.NOM_TABLE
                     LEFT JOIN LESTABLES E ON D.PARENT=E.NOM_TABLE AND E.PARENT<>E.NOM_TABLE
                     LEFT JOIN LESTABLES F ON E.PARENT=F.NOM_TABLE AND F.PARENT<>F.NOM_TABLE
    WHERE A.PARENT IS NOT NULL
    ou LESTABLES est le résultat du post #9

    à vous deux, bonne journée
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  14. #14
    Membre expert

    Homme Profil pro
    Consultant spécialité Firebird
    Inscrit en
    Mai 2002
    Messages
    2 342
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France

    Informations professionnelles :
    Activité : Consultant spécialité Firebird
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 342
    Points : 3 712
    Points
    3 712
    Par défaut
    avec ma soluton, pas de risque, puisque je ne boucle pas
    LIST : aggregat de chaines de caractères (Firebird 2.1)

    donc pour toi à priori le mieux c'est de faire une procédure qui boucle sur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    SELECT R.RDB$RELATION_NAME AS NOM_TABLE,D1.PARENT 
    FROM RDB$RELATIONS R
    LEFT JOIN 
    (SELECT A.RDB$RELATION_NAME ,c.RDB$RELATION_NAME AS PARENT
    FROM RDB$RELATION_CONSTRAINTS a 
     JOIN RDB$INDICES b ON (b.RDB$INDEX_NAME=a.RDB$INDEX_NAME)
     JOIN RDB$RELATION_CONSTRAINTS c ON (c.rdb$index_name=b.rdb$foreign_key)
    WHERE a.RDB$CONSTRAINT_TYPE='FOREIGN KEY') D1 
    ON R.RDB$RELATION_NAME=D1.RDB$RELATION_NAME 
    WHERE R.RDB$RELATION_TYPE=0 AND R.RDB$SYSTEM_FLAG=0
    ou en prenant ta dernière requete remplacer MESTABLES par le select ci dessus
    Philippe Makowski
    IBPhoenix - Firebird
    Membre de l'April

Discussions similaires

  1. obtenir une liste des noms de session d'un ordinateur
    Par Raylemon dans le forum API, COM et SDKs
    Réponses: 3
    Dernier message: 09/03/2006, 19h12
  2. Obtenir la liste des tables d'une table
    Par Pigoulou dans le forum PostgreSQL
    Réponses: 2
    Dernier message: 09/02/2005, 14h12
  3. Obtenir le listing des tables d'une BDD
    Par zoubidaman dans le forum Outils
    Réponses: 1
    Dernier message: 10/11/2004, 00h17
  4. Obtenir la liste des tables
    Par edamiral dans le forum PostgreSQL
    Réponses: 5
    Dernier message: 23/04/2004, 13h33

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