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

Requêtes PostgreSQL Discussion :

Ligne perdue sur changement de champ à afficher [9.5]


Sujet :

Requêtes PostgreSQL

  1. #1
    Membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Septembre 2009
    Messages
    37
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2009
    Messages : 37
    Points : 40
    Points
    40
    Par défaut Ligne perdue sur changement de champ à afficher
    Bonjour,

    J'ai un comportement que je n'arrive pas à expliquer.
    J'ai une requête du type:
    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
    WITH a AS (
       SELECT [...]
       FROM pg_depend
       WHERE [...]
    )
    SELECT 
       [...]
       COALESCE(ns.oid::text,  a.objid)     -- ligne qui fonctionne
    FROM 
       a
    LEFT OUTER JOIN  pg_constraint cs  ON  cs.oid = a.objid
    LEFT OUTER JOIN  pg_namespace  ns  ON  ns.oid = cs.connamespace
     
     
    -- Resultat => 6 lignes:
    pg_rewrite    | 12345 | schema_a.table_a | 7 | normal
    pg_rewrite    | 12345 | schema_a.table_a | 6 | normal
    pg_rewrite    | 12345 | schema_a.table_a | 1 | normal
    pg_constraint | 34567 | schema_a.table_a | 1 | automatic          -- ligne sur laquelle je bosse
    pg_trigger    | 56789 | schema_a.table_a | 0 | automatic
    pg_trigger    | 56789 | schema_a.table_a | 0 | automatic
    Elle me renvoie 6 lignes.

    Si je remplace "ns.oid::text" par "ns.nspname", je n'ai plus que 5 lignes (celle concernant pg_constraint disparait).
    Je m'attendait à ce que le nombre d'enregistrement reste le même et que seul l'affichage soit impacté, pas le filtrage...

    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
    WITH a AS (
       SELECT [...]
       FROM pg_depend
       WHERE [...]
    )
    SELECT 
       [...]
       COALESCE(ns.nspname,  a.objid)     -- ligne qui me turlupine !
    FROM 
       a
    LEFT OUTER JOIN  pg_constraint cs  ON  cs.oid = a.objid
    LEFT OUTER JOIN  pg_namespace  ns  ON  ns.oid = cs.connamespace
     
     
    -- Resultat => 5 lignes (celle concernant pg_constraint disparait)
    pg_rewrite    | 12345 | schema_a.table_a | 7 | normal
    pg_rewrite    | 12345 | schema_a.table_a | 6 | normal
    pg_rewrite    | 12345 | schema_a.table_a | 1 | normal
    pg_trigger    | 56789 | schema_a.table_a | 0 | automatic
    pg_trigger    | 56789 | schema_a.table_a | 0 | automatic
    Quelqu'un pourrait-il m'expliquer svp?




    Merci et bonne journée

  2. #2
    Membre expert
    Avatar de alassanediakite
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2006
    Messages
    1 599
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Mali

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2006
    Messages : 1 599
    Points : 3 590
    Points
    3 590
    Billets dans le blog
    8
    Par défaut
    Salut
    Je pense qu'il est mieux de donner le code en entier et non avec des trous.
    @+
    Le monde est trop bien programmé pour être l’œuvre du hasard…
    Mon produit pour la gestion d'école: www.logicoles.com

  3. #3
    Membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Septembre 2009
    Messages
    37
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2009
    Messages : 37
    Points : 40
    Points
    40
    Par défaut
    Pas de soucis:

    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
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
     
    WITH f AS (
            SELECT 
                pgd.objid,
                pgd.classid::regclass Source_Class,
                case pgd.classid 
                    when 'pg_class'::regclass      then pgd.objid::regclass::text 
                    when 'pg_type'::regclass       then pgd.objid::regtype::text 
                    when 'pg_proc'::regclass       then pgd.objid::regprocedure::text 
                    when 'pg_namespace'::regclass  then pgd.objid::regnamespace::text 
                    when 'pg_operator'::regclass   then pgd.objid::regoperator::text 
                    when 'pg_authid'::regclass     then pgd.objid::regrole::text 
                    when 'pg_ts_config'::regclass  then pgd.objid::regconfig::text 
                    when 'pg_ts_dict'::regclass    then pgd.objid::regdictionary::text 
                    else pgd.objid::text 
                end Source_Object, 
                pgd.objsubid, 
                pgd.refclassid::regclass Referenced_Class,
                case pgd.refclassid 
                    when 'pg_class'::regclass      then pgd.refobjid::regclass::text 
                    when 'pg_type'::regclass       then pgd.refobjid::regtype::text 
                    when 'pg_proc'::regclass       then pgd.refobjid::regprocedure::text 
                    when 'pg_namespace'::regclass  then pgd.refobjid::regnamespace::text 
                    when 'pg_operator'::regclass   then pgd.refobjid::regoperator::text 
                    when 'pg_authid'::regclass     then pgd.refobjid::regrole::text 
                    when 'pg_ts_config'::regclass  then pgd.refobjid::regconfig::text 
                    when 'pg_ts_dict'::regclass    then pgd.refobjid::regdictionary::text 
                    else pgd.refobjid::text 
                end Referenced_Object, 
                pgd.refobjsubid, 
                case pgd.deptype 
                    when 'p' then 'pinned' 
                    when 'i' then 'internal' 
                    when 'a' then 'automatic' 
                    when 'n' then 'normal' 
                end DepType 
            FROM pg_catalog.pg_depend pgd
            WHERE 
              (    refobjid::regclass::text      ~ '${schema}'
                OR refobjid::regtype::text       ~ '${schema}'
                OR refobjid::regprocedure::text  ~ '${schema}'
                OR refobjid::regnamespace::text  ~ '${schema}'
                OR refobjid::regoperator::text   ~ '${schema}'
                OR refobjid::regrole::text       ~ '${schema}'
                OR refobjid::regconfig::text     ~ '${schema}'
                OR refobjid::regdictionary::text ~ '${schema}'
                OR refobjid::text                ~ '${schema}'
              ) 
              AND  objid::regclass::text        !~ '${schema}'  AND  objid::regclass::text        !~ 'pg_toast'
              AND  objid::regtype::text         !~ '${schema}'  AND  objid::regtype::text         !~ 'pg_toast'
              AND  objid::regprocedure::text    !~ '${schema}'  AND  objid::regprocedure::text    !~ 'pg_toast'
              AND  objid::regnamespace::text    !~ '${schema}'  AND  objid::regnamespace::text    !~ 'pg_toast'
              AND  objid::regoperator::text     !~ '${schema}'  AND  objid::regoperator::text     !~ 'pg_toast'
              AND  objid::regrole::text         !~ '${schema}'  AND  objid::regrole::text         !~ 'pg_toast'
              AND  objid::regconfig::text       !~ '${schema}'  AND  objid::regconfig::text       !~ 'pg_toast'
              AND  objid::regdictionary::text   !~ '${schema}'  AND  objid::regdictionary::text   !~ 'pg_toast'
              AND  objid::text                  !~ '${schema}'  AND  objid::text                  !~ 'pg_toast'
        )
        SELECT 
            f.Source_Class,
            COALESCE(
                ns.nspname || '.' || pc.relname,
                f.Source_Object
            ) Source_Object,
            f.objsubid,
            f.Referenced_Class,
            f.Referenced_Object,
            f.refobjsubid,
            f.DepType
        FROM f
        -- ::: This Works (to replace pg_rewrite oid) :::
        -- LEFT OUTER JOIN pg_rewrite rw ON rw.oid = f.objid
        -- LEFT OUTER JOIN pg_class      pc ON pc.oid = rw.ev_class
        -- LEFT OUTER JOIN pg_namespace  ns ON ns.oid = pc.relnamespace
        -- ::: This doesn't (to replace pg_constraint oid) :::
        LEFT OUTER JOIN pg_constraint cs ON cs.oid = f.objid
        LEFT OUTER JOIN pg_class      pc ON pc.oid = cs.conrelid
        LEFT OUTER JOIN pg_namespace  ns ON ns.oid = cs.connamespace
        ORDER BY refobjsubid DESC

  4. #4
    Membre expert
    Avatar de alassanediakite
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2006
    Messages
    1 599
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Mali

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2006
    Messages : 1 599
    Points : 3 590
    Points
    3 590
    Billets dans le blog
    8
    Par défaut
    Salut
    J'ai tenter les deux cas...
    La partie en rouge et gras pose problème
    Citation Envoyé par Asphator Voir le message
    Pas de soucis:

    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
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    WITH f AS (
            SELECT 
                pgd.objid,
                pgd.classid::regclass Source_Class,
                case pgd.classid 
                    when 'pg_class'::regclass      then pgd.objid::regclass::text 
                    when 'pg_type'::regclass       then pgd.objid::regtype::text 
                    when 'pg_proc'::regclass       then pgd.objid::regprocedure::text 
                    when 'pg_namespace'::regclass  then pgd.objid::regnamespace::text 
                    when 'pg_operator'::regclass   then pgd.objid::regoperator::text 
                    when 'pg_authid'::regclass     then pgd.objid::regrole::text 
                    when 'pg_ts_config'::regclass  then pgd.objid::regconfig::text 
                    when 'pg_ts_dict'::regclass    then pgd.objid::regdictionary::text 
                    else pgd.objid::text 
                end Source_Object, 
                pgd.objsubid, 
                pgd.refclassid::regclass Referenced_Class,
                case pgd.refclassid 
                    when 'pg_class'::regclass      then pgd.refobjid::regclass::text 
                    when 'pg_type'::regclass       then pgd.refobjid::regtype::text 
                    when 'pg_proc'::regclass       then pgd.refobjid::regprocedure::text 
                    when 'pg_namespace'::regclass  then pgd.refobjid::regnamespace::text 
                    when 'pg_operator'::regclass   then pgd.refobjid::regoperator::text 
                    when 'pg_authid'::regclass     then pgd.refobjid::regrole::text 
                    when 'pg_ts_config'::regclass  then pgd.refobjid::regconfig::text 
                    when 'pg_ts_dict'::regclass    then pgd.refobjid::regdictionary::text 
                    else pgd.refobjid::text 
                end Referenced_Object, 
                pgd.refobjsubid, 
                case pgd.deptype 
                    when 'p' then 'pinned' 
                    when 'i' then 'internal' 
                    when 'a' then 'automatic' 
                    when 'n' then 'normal' 
                end DepType 
            FROM pg_catalog.pg_depend pgd
            WHERE 
              (    refobjid::regclass::text      ~ '${schema}'
                OR refobjid::regtype::text       ~ '${schema}'
                OR refobjid::regprocedure::text  ~ '${schema}'
                OR refobjid::regnamespace::text  ~ '${schema}'
                OR refobjid::regoperator::text   ~ '${schema}'
                OR refobjid::regrole::text       ~ '${schema}'
                OR refobjid::regconfig::text     ~ '${schema}'
                OR refobjid::regdictionary::text ~ '${schema}'
                OR refobjid::text                ~ '${schema}'
              ) 
              AND  objid::regclass::text        !~ '${schema}'  AND  objid::regclass::text        !~ 'pg_toast'
              AND  objid::regtype::text         !~ '${schema}'  AND  objid::regtype::text         !~ 'pg_toast'
              AND  objid::regprocedure::text    !~ '${schema}'  AND  objid::regprocedure::text    !~ 'pg_toast'
              AND  objid::regnamespace::text    !~ '${schema}'  AND  objid::regnamespace::text    !~ 'pg_toast'
              AND  objid::regoperator::text     !~ '${schema}'  AND  objid::regoperator::text     !~ 'pg_toast'
              AND  objid::regrole::text         !~ '${schema}'  AND  objid::regrole::text         !~ 'pg_toast'
              AND  objid::regconfig::text       !~ '${schema}'  AND  objid::regconfig::text       !~ 'pg_toast'
              AND  objid::regdictionary::text   !~ '${schema}'  AND  objid::regdictionary::text   !~ 'pg_toast'
              AND  objid::text                  !~ '${schema}'  AND  objid::text                  !~ 'pg_toast'
        )
        SELECT 
            f.Source_Class,
            COALESCE(
                ns.nspname || '.' || pc.relname,
                f.Source_Object
            ) Source_Object,
            f.objsubid,
            f.Referenced_Class,
            f.Referenced_Object,
            f.refobjsubid,
            f.DepType
        FROM f
        -- ::: This Works (to replace pg_rewrite oid) :::
        -- LEFT OUTER JOIN pg_rewrite rw ON rw.oid = f.objid
        -- LEFT OUTER JOIN pg_class      pc ON pc.oid = rw.ev_class
        -- LEFT OUTER JOIN pg_namespace  ns ON ns.oid = cs.relnamespace
        -- ::: This doesn't (to replace pg_constraint oid) :::
        LEFT OUTER JOIN pg_constraint cs ON cs.oid = f.objid
        LEFT OUTER JOIN pg_class      pc ON pc.oid = cs.conrelid
        LEFT OUTER JOIN pg_namespace  ns ON ns.oid = cs.connamespace
        ORDER BY refobjsubid DESC
    En le remplaçant par pc, cela passe.
    Les deux requêtes donne le même résultat chez moi...
    Je supprimer le filtre de la sous-requête with...
    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
    WHERE 
              (    refobjid::regclass::text      ~ '${schema}'
                OR refobjid::regtype::text       ~ '${schema}'
                OR refobjid::regprocedure::text  ~ '${schema}'
                OR refobjid::regnamespace::text  ~ '${schema}'
                OR refobjid::regoperator::text   ~ '${schema}'
                OR refobjid::regrole::text       ~ '${schema}'
                OR refobjid::regconfig::text     ~ '${schema}'
                OR refobjid::regdictionary::text ~ '${schema}'
                OR refobjid::text                ~ '${schema}'
              ) 
              AND  objid::regclass::text        !~ '${schema}'  AND  objid::regclass::text        !~ 'pg_toast'
              AND  objid::regtype::text         !~ '${schema}'  AND  objid::regtype::text         !~ 'pg_toast'
              AND  objid::regprocedure::text    !~ '${schema}'  AND  objid::regprocedure::text    !~ 'pg_toast'
              AND  objid::regnamespace::text    !~ '${schema}'  AND  objid::regnamespace::text    !~ 'pg_toast'
              AND  objid::regoperator::text     !~ '${schema}'  AND  objid::regoperator::text     !~ 'pg_toast'
              AND  objid::regrole::text         !~ '${schema}'  AND  objid::regrole::text         !~ 'pg_toast'
              AND  objid::regconfig::text       !~ '${schema}'  AND  objid::regconfig::text       !~ 'pg_toast'
              AND  objid::regdictionary::text   !~ '${schema}'  AND  objid::regdictionary::text   !~ 'pg_toast'
              AND  objid::text                  !~ '${schema}'  AND  objid::text                  !~ 'pg_toast'
    Un peut plus d'effort...
    Reprend les deux requêtes séparément et chacune avec son résultat.
    @+
    Le monde est trop bien programmé pour être l’œuvre du hasard…
    Mon produit pour la gestion d'école: www.logicoles.com

  5. #5
    Membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Septembre 2009
    Messages
    37
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2009
    Messages : 37
    Points : 40
    Points
    40
    Par défaut
    Merci pour ta réponse.

    C'est une erreur de recopie pour le cs, c'est bien pc que j'ai dans mon code, désolé. Je corrige.
    Quoiqu'il en soit, c'est une section en commentaire, ce n'est pas cette section qui pose problème, celle commentée est justement celle qui fonctionne.
    Ou alors, je n'ai pas compris ta réponse.



    EDIT:
    Je viens de faire un test.
    Si je fais un echo de ma requête (dans le script bash) et la colle dans psql, j'obtiens mes 6 lignes. Si je fais un psql au lieu de echo dans le script, je n'en obtiens que 5...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     psql -h ${host} -d ${db} -Atc "${query}"
    Weird !

  6. #6
    Membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Septembre 2009
    Messages
    37
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2009
    Messages : 37
    Points : 40
    Points
    40
    Par défaut
    Ok, trouvé ! Je suis une quiche...

    C'est dans le bash qu'il y avait souci pas dans la requête.
    Désolé pour le dérangement..

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

Discussions similaires

  1. evenement sur changement de Champs Calculé
    Par didtop dans le forum VBA Access
    Réponses: 1
    Dernier message: 09/02/2009, 23h20
  2. Réponses: 2
    Dernier message: 15/03/2007, 15h11
  3. Réponses: 2
    Dernier message: 19/09/2006, 21h34
  4. Réponses: 6
    Dernier message: 21/04/2006, 11h22
  5. afficher une ligne contante sur le graphe d'un DBChart ?
    Par bigfoot dans le forum Bases de données
    Réponses: 5
    Dernier message: 23/12/2004, 16h33

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