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 :

Curseur ou jointure ?


Sujet :

Langage SQL

  1. #1
    Candidat au Club
    Inscrit en
    Octobre 2010
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Octobre 2010
    Messages : 4
    Points : 4
    Points
    4
    Par défaut Curseur ou jointure ?
    j'ai un petit souci.

    je travaille avec deux tables.dans l'une des tables j'ai une colonne PCI et des libellés qui correspondent à ces codes.
    dans l'autre j'ai des codes PCI 1, PCI2, PCI 3.
    je voudrais don c prendre chaque PCI 1 2 ET 3,les comparer au PCI,et aisi avoir le libellés.

    je voudrais dans mon fichier de sortie pour chaque lignes avoir PCI1 et son libellés, PCI2 et son libellés.
    j'ai utilisé la requete
    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
    DECLARE CURSEUR1 CURSOR FOR 
    SELECT P.NUMDSS, 
       D.LIBDSS, 
       P.CODPCIEPLDTX, 
       E.LIBPCI, 
       P.CODPCIPRVCRCDTX, 
       E2.LIBPCI, 
       P.CODPCIPRVCRCRTC, 
       E3.LIBPCI, 
       P.CODPCIEXDPRV, 
       E4.LIBPCI, 
       P.DATFINOK, 
       P.DATMAJ 
    FROM TO6PROV P, TO6CPCI E 
    FROM TO6PROV P, TO6CPCI E, TO6DOSS D, 
       TO6CPCI E2, TO6CPCI E3, TO6CPCI E4 
    WHERE P.CODPCIEPLDTX = E.CODPCI 
       AND P.CODPCIPRVCRCDTX = E2.CODPCI 
       AND P.CODPCIPRVCRCRTC = E3.CODPCI 
       AND P.CODPCIEXDPRV = E4.CODPCI 
       AND P.CODPCIEXDPRV = E4.CODPCI 
       AND P.NUMDSS = D.NUMDSS 
    ORDER BY NUMDSS ASC, 
       CODPCIEPLDTX ASC 
    FOR FETCH ONLY 
    END-EXEC
    et le fetch
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    EXEC SQL FETCH CURSEUR1 INTO 
    DCLTO6PROV.NUMDSS, 
    0 CLTO6DOSS.LIBDSS, 
    DCLTO6PROV.CODPCIEPLDTX, 
    9 CLTO6CPCI.LIBPCI, 
    DCLTO6PROV.CODPCIPRVCRCDTX, 
    0 CLTO6CPCI.LIBPCI, 
    DCLTO6PROV.CODPCIPRVCRCRTC:IND-CODPCIPRVCRCRTC, 
    0 CLTO6CPCI.LIBPCI, 
    DCLTO6PROV.CODPCIEXDPRV, 
    0 CLTO6CPCI.LIBPCI, 
    DCLTO6PROV.DATFINOK, 
    DCLTO6PROV.DATMAJ 
    END-EXEC
    mon probleme est que je voudrais faire une distinction entre les LIBPCI,mais pour l'instant ce sont tous les meme

  2. #2
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 048
    Points
    34 048
    Billets dans le blog
    14
    Par défaut
    J'ai du mal à comprendre ton besoin...
    je travaille avec deux tables. Dans l'une des tables, j'ai une colonne PCI et des libellés qui correspondent à ces codes.
    dans l'autre j'ai des codes PCI 1, PCI2, PCI 3.
    En nous donnant directement la structure des tables, comme demandé dans les règles du forum, ce serait plus facile car en plus les noms de tes tables ne sont pas très signifiants.

    je voudrais donc prendre chaque PCI 1 2 ET 3, les comparer au PCI,et ainsi avoir les libellés.
    Ceci ne nous dit pas quelles colonnes de quelles tables sont concernées par l'opération.

    j'ai utilisé la requête
    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
    DECLARE CURSEUR1 CURSOR FOR 
    SELECT P.NUMDSS, 
       D.LIBDSS, 
       P.CODPCIEPLDTX, 
       E.LIBPCI, 
       P.CODPCIPRVCRCDTX, 
       E2.LIBPCI, 
       P.CODPCIPRVCRCRTC, 
       E3.LIBPCI, 
       P.CODPCIEXDPRV, 
       E4.LIBPCI, 
       P.DATFINOK, 
       P.DATMAJ 
    FROM TO6PROV P, TO6CPCI E 
    FROM TO6PROV P, TO6CPCI E, TO6DOSS D, 
       TO6CPCI E2, TO6CPCI E3, TO6CPCI E4 
    WHERE P.CODPCIEPLDTX = E.CODPCI 
       AND P.CODPCIPRVCRCDTX = E2.CODPCI 
       AND P.CODPCIPRVCRCRTC = E3.CODPCI 
       AND P.CODPCIEXDPRV = E4.CODPCI 
       AND P.CODPCIEXDPRV = E4.CODPCI 
       AND P.NUMDSS = D.NUMDSS 
    ORDER BY NUMDSS ASC, 
       CODPCIEPLDTX ASC 
    FOR FETCH ONLY 
    END-EXEC
    Il y a un FROM en trop dans ta requête !

    Tu écris les jointures avec une syntaxe obsolète depuis 1992, ce qui rend la requête plus difficile à lire et peut entraîner des erreurs.

    mon problème est que je voudrais faire une distinction entre les LIBPCI,mais pour l'instant ce sont tous les mêmes
    Il faut mettre un alias aux colonnes de même nom pour les différencier, à l'aide du mot clé AS, qui est parfois facultatif.

    En récrivant ta requête correctement, je constate aussi qu'il y avait une condition de jointure en double, ce qui confirme ce que je disais plus haut : utilise la syntaxe normalisée avec l'opérateur JOIN.
    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
    DECLARE CURSEUR1 CURSOR FOR 
    SELECT P.NUMDSS, 
       D.LIBDSS, 
       P.CODPCIEPLDTX, 
       E.LIBPCI AS LIBPCI_E, 
       P.CODPCIPRVCRCDTX, 
       E2.LIBPCI AS LIBPCI_E2, 
       P.CODPCIPRVCRCRTC, 
       E3.LIBPCI AS LIBPCI_E3, 
       P.CODPCIEXDPRV, 
       E4.LIBPCI AS LIBPCI_E4, 
       P.DATFINOK, 
       P.DATMAJ 
    FROM TO6PROV P
    INNER JOIN TO6CPCI E ON P.CODPCIEPLDTX = E.CODPCI 
    INNER JOIN TO6DOSS D ON P.NUMDSS = D.NUMDSS 
    INNER JOIN TO6CPCI E2 ON P.CODPCIPRVCRCDTX = E2.CODPCI 
    INNER JOIN TO6CPCI E3 ON P.CODPCIPRVCRCRTC = E3.CODPCI 
    INNER JOIN TO6CPCI E4 ON P.CODPCIEXDPRV = E4.CODPCI
    ORDER BY NUMDSS ASC, 
       CODPCIEPLDTX ASC 
    FOR FETCH ONLY 
    END-EXEC

  3. #3
    Candidat au Club
    Inscrit en
    Octobre 2010
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Octobre 2010
    Messages : 4
    Points : 4
    Points
    4
    Par défaut sql db2
    Bonjour CinePhil et merci pour ton aide mais mon souci persiste.

    Mes tables sont :
    TO6CPCI (CODPCI , LIBPCI, DATFINOK, DATMAJ)
    TO6DOSS (NUMDSS, LIBDSS, DATFINOK, DATMAJ)
    TO6PROV (NUMDSS, CODPCIEPLDTX, CODPCIPRVCRCDTX, CODPCIPRVCRCRTC, CODPCIEXDPRV, DATFINOK, DATMAJ)

    Mon but est d'avoir les libellés des code PCI de la table TO6PROV :
    • CODPCIEPLDTX
    • CODPCIPRVCRCDTX
    • CODPCIPRVCRCRTC
    • CODPCIEXDPRV


    Donc je prends ces codes, je les compare au code PCI de la table TO6CPCI et j'ai le libellé correspondant.

    Mais mon problème persiste.
    Il est vrai que ta requête m'est utile.
    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
    DECLARE CURSEUR1 CURSOR FOR 
    SELECT P.NUMDSS, 
    D.LIBDSS, 
    P.CODPCIEPLDTX, 
    E.LIBPCI AS LIBPCI_E, 
    P.CODPCIPRVCRCDTX, 
    E2.LIBPCI AS LIBPCI_E2, 
    P.CODPCIPRVCRCRTC, 
    E3.LIBPCI AS LIBPCI_E3, 
    P.CODPCIEXDPRV, 
    E4.LIBPCI AS LIBPCI_E4, 
    P.DATFINOK, 
    P.DATMAJ 
    FROM TO6PROV P
    INNER JOIN TO6CPCI E ON P.CODPCIEPLDTX = E.CODPCI 
    INNER JOIN TO6DOSS D ON P.NUMDSS = D.NUMDSS 
    INNER JOIN TO6CPCI E2 ON P.CODPCIPRVCRCDTX = E2.CODPCI 
    INNER JOIN TO6CPCI E3 ON P.CODPCIPRVCRCRTC = E3.CODPCI 
    INNER JOIN TO6CPCI E4 ON P.CODPCIEXDPRV = E4.CODPCI
    ORDER BY NUMDSS ASC, 
    CODPCIEPLDTX ASC 
    FOR FETCH ONLY 
    END-EXEC
    Néanmoins pour mon fetch into, je ne connais pas la "bonne écriture".
    Je n'arrive pas à écrire correctement mes host variables.
    J'ai essayé ça mais ça ne marche pas :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    FETCH CURSEUR1 INTO 
    DCLTO6PROV.NUMDSS, 
    DCLTO6DOSS.LIBDSS, 
    DCLTO6PROV.CODPCIEPLDTX, 
    DCLTO6CPCI.LIBPCI_E, 
    DCLTO6PROV.CODPCIPRVCRCDTX, 
    DCLTO6CPCI.LIBPCI_E1, 
    DCLTO6PROV.CODPCIPRVCRCRTC:IND-CODPCIPRVCRCRTC, 
    DCLTO6CPCI.LIBPCI_E2, 
    DCLTO6PROV.CODPCIEXDPRV, 
    DCLTO6CPCI.LIBPCI_E3, 
    DCLTO6PROV.DATFINOK, 
    DCLTO6PROV.DATMAJ 
    END-EXEC
    Je te remercie pour tes réponses.

  4. #4
    Membre éprouvé
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    821
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Mai 2008
    Messages : 821
    Points : 1 084
    Points
    1 084
    Par défaut
    Ton fetch a l'air correct sauf peut-être la ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DCLTO6PROV.CODPCIPRVCRCRTC:IND-CODPCIPRVCRCRTC,
    Tu mets un coup des variables hôtes avec les : (deux points) ce qui laisse présager un Embedded SQL et pour les autre variables non (ce qui laisse présager une procédure, fonction ou trigger SQL. Donc un problème.

    Avec quel langage programmes-tu ?
    Quel est le message d'erreur ?
    Et toujours la question, la fameuse question, l'éternelle question :
    Quelle SGBD, Quelle plate-forme ?
    Quelle version ?

Discussions similaires

  1. Position du curseur
    Par gimlithedwarf dans le forum Composants VCL
    Réponses: 2
    Dernier message: 22/08/2002, 23h45
  2. Masquer le curseur en mode MS-DOS
    Par Alex120 dans le forum C
    Réponses: 2
    Dernier message: 10/07/2002, 09h30
  3. Comment limiter les mouvements du curseur??
    Par scorpiwolf dans le forum C++Builder
    Réponses: 9
    Dernier message: 07/07/2002, 22h09
  4. Comment masquer le curseur de la souris ?
    Par benj63 dans le forum C++Builder
    Réponses: 4
    Dernier message: 26/06/2002, 18h54
  5. Position du curseur dans Edit
    Par MrJéjé dans le forum C++Builder
    Réponses: 3
    Dernier message: 20/06/2002, 17h09

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