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 :

Extraction PK et FK depuis les RDB$


Sujet :

SQL Firebird

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Expert confirmé
    Avatar de qi130
    Homme Profil pro
    Expert Processus IT
    Inscrit en
    Mars 2003
    Messages
    3 947
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France

    Informations professionnelles :
    Activité : Expert Processus IT
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2003
    Messages : 3 947
    Par défaut Extraction PK et FK depuis les RDB$
    Bonjour,

    Je cherche à obtenir en 1 seule requète le nb de PK et le nb de FK définies sur les tables "utilisateur" d'une DB

    J'ai donc sorti mon guide SQL pour programmer ç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
    select a.rdb$relation_name as Tabl, a.rdb$field_id as Nb_col, count(b.RDB$FIELD_NAME) as Nb_PK
    from  rdb$index_segments b
    inner join rdb$relation_constraints r on b.rdb$index_name=r.rdb$index_name
                                         AND r.rdb$constraint_type='PRIMARY KEY'
    inner join rdb$relations a on a.rdb$relation_name=r.rdb$relation_name
    where a.RDB$SYSTEM_FLAG=0
    union
    select c.rdb$relation_name as Tabl, c.rdb$field_id as Nb_col,count(z.RDB$FIELD_NAME) as Nb_FK
    from rdb$index_segments z
    inner join rdb$relation_constraints k on z.rdb$index_name=k.rdb$index_name
                                         AND k.rdb$constraint_type='FOREIGN KEY'
    inner join rdb$relations c on c.rdb$relation_name=k.rdb$relation_name
    where c.RDB$SYSTEM_FLAG=0
    group by a.rdb$relation_name ,a.rdb$field_id
    et devinez...
    Citation Envoyé par IBexpert
    Invalid expression in the select list (not contained in either an aggregate function or the GROUP BY clause).
    Et même punition avec le group by embarquant c.rdb$relation_name et c.rdb$field_id en +
    Idem en partant de rdb$relations et le 2nd inner sur rdb$index_segments

    Par contre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    select a.rdb$relation_name as Tabl, a.rdb$field_id as Nb_col, count(b.RDB$FIELD_NAME) as Nb_PK
    from rdb$relations a
    inner join rdb$relation_constraints r on a.rdb$relation_name=r.rdb$relation_name
                                         AND r.rdb$constraint_type='PRIMARY KEY'
    inner join rdb$index_segments b on b.rdb$index_name=r.rdb$index_name
    where a.RDB$SYSTEM_FLAG=0
    group by a.rdb$relation_name ,a.rdb$field_id
    marche correctement, mais je n'ai que les PK...
    D'où l'idée du UNION.

    Qui peut m'aider ?

  2. #2
    Rédacteur/Modérateur

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

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 706
    Billets dans le blog
    65
    Par défaut
    Salut

    pour les FK voir mon post et ses suites ici

  3. #3
    Expert confirmé
    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 : 62
    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
    Par défaut
    Salut

    Il te manque un group by sur le 1° select avant l'union. Non ?

    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
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    SELECT
      A.RDB$RELATION_NAME AS TABL,
      A.RDB$FIELD_ID AS NB_COL,
      COUNT(B.RDB$FIELD_NAME) AS NB_PK
    FROM
      RDB$INDEX_SEGMENTS B
      JOIN RDB$RELATION_CONSTRAINTS R
        ON B.RDB$INDEX_NAME=R.RDB$INDEX_NAME AND R.RDB$CONSTRAINT_TYPE='PRIMARY KEY'
      JOIN RDB$RELATIONS A
        ON A.RDB$RELATION_NAME=R.RDB$RELATION_NAME
    WHERE
      A.RDB$SYSTEM_FLAG=0
    GROUP BY
      1, 2
     
    UNION
    SELECT
      C.RDB$RELATION_NAME AS TABL,
      C.RDB$FIELD_ID AS NB_COL,
      COUNT(Z.RDB$FIELD_NAME) AS NB_FK
    FROM
      RDB$INDEX_SEGMENTS Z
    INNER JOIN
      RDB$RELATION_CONSTRAINTS K
        ON Z.RDB$INDEX_NAME=K.RDB$INDEX_NAME AND K.RDB$CONSTRAINT_TYPE='FOREIGN KEY'
      JOIN RDB$RELATIONS C
        ON C.RDB$RELATION_NAME=K.RDB$RELATION_NAME
    WHERE
      C.RDB$SYSTEM_FLAG=0
    GROUP BY
      1, 2
    Sinon en ce moment je suis sur les CTEs, j'ai ça aussi:
    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
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    WITH
      PKS AS (
        SELECT
          A.RDB$RELATION_NAME AS TABL,
          A.RDB$FIELD_ID AS NB_COL,
          COUNT(B.RDB$FIELD_NAME) AS NB_PK,
          LIST(TRIM(B.RDB$FIELD_NAME)) PK_LIST
        FROM
          RDB$INDEX_SEGMENTS B
          JOIN RDB$RELATION_CONSTRAINTS R
            ON B.RDB$INDEX_NAME=R.RDB$INDEX_NAME AND R.RDB$CONSTRAINT_TYPE='PRIMARY KEY'
          JOIN RDB$RELATIONS A
            ON A.RDB$RELATION_NAME=R.RDB$RELATION_NAME
        WHERE
          A.RDB$SYSTEM_FLAG=0
        GROUP BY
          1, 2
      ),
      FKS AS (
        SELECT
          C.RDB$RELATION_NAME AS TABL,
          COUNT(Z.RDB$FIELD_NAME) AS NB_FK,
          LIST(TRIM(Z.RDB$FIELD_NAME)) FK_LIST
        FROM
          RDB$INDEX_SEGMENTS Z
        JOIN RDB$RELATION_CONSTRAINTS K
            ON Z.RDB$INDEX_NAME=K.RDB$INDEX_NAME AND K.RDB$CONSTRAINT_TYPE='FOREIGN KEY'
        JOIN RDB$RELATIONS C
            ON C.RDB$RELATION_NAME=K.RDB$RELATION_NAME
        WHERE
          C.RDB$SYSTEM_FLAG=0
        GROUP BY
          1
      )
    SELECT
      PKS.TABL, PKS.NB_COL, PKS.NB_PK, PKS.PK_LIST, FKS.NB_FK, FKS.FK_LIST
    FROM
      PKS LEFT JOIN FKS ON PKS.TABL = FKS.TABL
    @+ Claudius

  4. #4
    Expert confirmé
    Avatar de qi130
    Homme Profil pro
    Expert Processus IT
    Inscrit en
    Mars 2003
    Messages
    3 947
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France

    Informations professionnelles :
    Activité : Expert Processus IT
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2003
    Messages : 3 947
    Par défaut
    Haaaa !

    avec le group by 1,2 la requète passe, mais les FK ne sont pas affichées (pas de colonne Nb_FK dans le grid....

  5. #5
    Expert confirmé
    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 : 62
    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
    Par défaut
    Comme tu fais un union les champs NB_PK et NB_FK ne font qu'un et porte le nom de NB_PK celui de la 1° requête.

  6. #6
    Expert confirmé
    Avatar de qi130
    Homme Profil pro
    Expert Processus IT
    Inscrit en
    Mars 2003
    Messages
    3 947
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France

    Informations professionnelles :
    Activité : Expert Processus IT
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2003
    Messages : 3 947
    Par défaut
    Alors, retour à la case départ

  7. #7
    Expert confirmé
    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 : 62
    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
    Par défaut
    As-tu essayé ma 2° requête avec les CTEs (si tu es sous 2.1) ?

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 2
    Dernier message: 18/12/2013, 00h13
  2. Charger une image depuis les ressources projets
    Par Flackou dans le forum DirectX
    Réponses: 2
    Dernier message: 04/06/2007, 15h34
  3. [matplotlib] installation depuis les sources
    Par guiph dans le forum Déploiement/Installation
    Réponses: 3
    Dernier message: 10/05/2006, 15h05
  4. Extraction fichier Excel - Probleme avec les VbCrLf
    Par oromeyer dans le forum Modules
    Réponses: 3
    Dernier message: 16/02/2006, 20h06
  5. Réponses: 4
    Dernier message: 21/04/2005, 17h07

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