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 :

syntaxe avec un if


Sujet :

Langage SQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé Avatar de cubepiege
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    161
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 161
    Par défaut syntaxe avec un if
    Bonjour je debute en sql et je cherche a faire une operation de comparaison entre deux tables que j'ai crééé sur des champ bien precis et faire un operation de update sur une troisieme en fonction du resultat obtenu. Mais il me donne erreur de syntaxe:

    Voici:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    IF (SELECT     (DES_COGNOMEPERS, DES_NOMEPERS, DTA_NASCITAPERS
          FROM          UNIQUEID1) =
        (SELECT     (DES_COGNOMEPERS, DES_NOMEPERS, DTA_NASCITAPERS
          FROM          UNIQUEID2) BEGIN
        UPDATE    ANAGTESTREPLACE
         SET              ID_PERSONA =
                                    (SELECT     ID_PERSONA
                                      FROM          UNIQUEID2) END
    Pour l'histoire, j'ai une table qui s'appelle a l'origine 'ANAGTESTREPLACE'
    J'extrait des colonnes de cette table (4: 'ID' 'NOM' 'PRENOM' 'DATE DE NAISSANCE') avec ses donnees et j'ecris dans UNIQUEID1.
    Ensuite je met a jour la table ANAGPERS avec des nouvelles donnes qui ecrasent les anciennes. Re j'extrait 4 colonnes dans une table (UNIQUEID2)
    Le but du jeu est de comparer 3 donnees nom prenom et date de naissance. Si il y a correspondance entre les deux tables creees on remplace les anciens id pour chaque personne dans ANAGTESTREPLACE par les nouveaux présents dans UNIQUEID2.
    Ca parrait idiot mais pour le principe j'ai besoin de comprendre cette operation pour appliquer a d'autres contextes.
    Merci

  2. #2
    Membre expérimenté Avatar de souellet
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    155
    Détails du profil
    Informations personnelles :
    Âge : 56
    Localisation : Canada

    Informations forums :
    Inscription : Juillet 2003
    Messages : 155
    Par défaut
    Salut,

    De savoir ton SGBD pourrait nous aider à te répondre.

    Ce que je vois comme requête serait du genre;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    UPDATE ANAGTESTREPLACE T1 
    SET T1.ID_PERSONA = 
        (SELECT T2.ID_PERSONA  
          FROM UNIQUEID1 T1 
          JOIN UNIQUEID2 T2  ON T1.DES_COGNOMEPERS = T2.DES_COGNOMEPERS
          AND T1.DES_NOMEPERS = T2.DES_NOMEPERS
          AND T1.DTA_NASCITAPERS = T2.DTA_NASCITAPERS)
    La sous-requête se trouve à te sortir les enregistrements qui concordent entre les 2 tables UNIQUEID à cause du JOIN.

    Ça devrait être un bon début.

  3. #3
    Membre confirmé Avatar de cubepiege
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    161
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 161
    Par défaut
    merci je vais tavailler la dessus, pour info je travaille sous windows - sql server 2000

    merci.
    Au fait T1 et T2 ca correspond a quoi?

  4. #4
    Membre confirmé Avatar de cubepiege
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    161
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 161
    Par défaut
    ok apres correction du nom des tables, voici la requete j'ai supprime les T1 T2 car pour moi c'est plus lisible

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    UPDATE    ANAGPERSTESTREP
    SET      ID_PERSONA =
         (SELECT     UNIQUEID2.ID_PERSONA
         FROM        UNIQUEID1 JOIN
           UNIQUEID2 ON UNIQUEID1.DES_COGNOMEPERS = UNIQUEID2.DES_COGNOMEPERS AND 
           UNIQUEID1.DES_NOMEPERS = UNIQUEID2.DES_NOMEPERS
     AND UNIQUEID1.DTA_NASCITAPERS = UNIQUEID2.DTA_NASCITAPERS)
    Mais maintenant il me fait un message d'erreur:
    "La sous requete a generée plusieures valeurs, cela n'est pas autorisé quand la sous requete suit =, !=, etc... ou quand elle st utilisée en tant qu'expression"

    Si quelqu'un peut m'aider, j'y comprends rien!
    merci

  5. #5
    Membre expérimenté Avatar de souellet
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    155
    Détails du profil
    Informations personnelles :
    Âge : 56
    Localisation : Canada

    Informations forums :
    Inscription : Juillet 2003
    Messages : 155
    Par défaut
    C'est parce que la sous-requête ramène plus d'une ligne.
    Il faut donc mettre un FETCH (dans le cas de DB2)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    UPDATE    ANAGPERSTESTREP 
    SET      ID_PERSONA = 
         (SELECT     UNIQUEID2.ID_PERSONA 
         FROM        UNIQUEID1 JOIN 
           UNIQUEID2 ON UNIQUEID1.DES_COGNOMEPERS = UNIQUEID2.DES_COGNOMEPERS AND 
           UNIQUEID1.DES_NOMEPERS = UNIQUEID2.DES_NOMEPERS 
     AND UNIQUEID1.DTA_NASCITAPERS = UNIQUEID2.DTA_NASCITAPERS
    FETCH FIRST ROW ONLY)

  6. #6
    Inactif   Avatar de Médiat
    Inscrit en
    Décembre 2003
    Messages
    1 946
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 946
    Par défaut
    La première question à se poser est : quelle est la bonne valeur ?
    Il n'y a aucun lien entre ANAGPERSTESTREP et UNIQUEID1/UNIQUEID2.

    Je verrais plutôt :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    UPDATE ANAGPERSTESTREP 
    SET    ID_PERSONA = (SELECT UNIQUEID2.ID_PERSONA 
                         FROM UNIQUEID1 JOIN 
                              UNIQUEID2 ON UNIQUEID1.DES_COGNOMEPERS = UNIQUEID2.DES_COGNOMEPERS 
                                       AND UNIQUEID1.DES_NOMEPERS    = UNIQUEID2.DES_NOMEPERS 
                                       AND UNIQUEID1.DTA_NASCITAPERS = UNIQUEID2.DTA_NASCITAPERS
                         WHERE UNIQUEID1.DES_COGNOMEPERS = ANAGPERSTESTREP.DES_COGNOMEPERS 
                           AND UNIQUEID1.DES_NOMEPERS    = ANAGPERSTESTREP.DES_NOMEPERS 
                           AND UNIQUEID1.DTA_NASCITAPERS = ANAGPERSTESTREP.DTA_NASCITAPERS)
    Et j'ai peur que, même comme cela tu ne mettes à NULL les ID non trouvés (sauf violation de contrainte bien sur). Auquel cas il faudra ajouter un WHERE à l'UPDATE (et non au SELECT) avec EXISTS :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    WHERE EXISTS (SELECT UNIQUEID2.ID_PERSONA 
                  FROM UNIQUEID1 JOIN 
                       UNIQUEID2 ON UNIQUEID1.DES_COGNOMEPERS = UNIQUEID2.DES_COGNOMEPERS 
                                AND UNIQUEID1.DES_NOMEPERS    = UNIQUEID2.DES_NOMEPERS 
                                AND UNIQUEID1.DTA_NASCITAPERS = UNIQUEID2.DTA_NASCITAPERS
                  WHERE UNIQUEID1.DES_COGNOMEPERS = ANAGPERSTESTREP.DES_COGNOMEPERS 
                    AND UNIQUEID1.DES_NOMEPERS    = ANAGPERSTESTREP.DES_NOMEPERS 
                    AND UNIQUEID1.DTA_NASCITAPERS = ANAGPERSTESTREP.DTA_NASCITAPERS)
    Si quelqu'un connaît une méthode plus élégante, je suis preneur.

  7. #7
    Membre confirmé Avatar de cubepiege
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    161
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 161
    Par défaut
    merci beaucoup je vais essayer avec çà.
    Pour les valeurs NULL dans l'immediat tant pis, mais bon.... lol ca serait mieux effectivement si ca pouvait eviter de me les ecraser. (gestion de ressources humaines!)
    je te tiens au courant apres mes essais.

    Bye

  8. #8
    Membre confirmé Avatar de cubepiege
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    161
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 161
    Par défaut
    ok pour SOUELLET, en fait je crois que la syntaxe n'est pas reconnue sur sql server 2000 le fetch first row only n'est pas reconnu comme syntaxe valide.

    Une idée?
    Sinon pour media l'erreur est la même ca ne peux pas marcher comme çà, car il y plusieurs resultats retournés

    Merci

  9. #9
    Inactif   Avatar de Médiat
    Inscrit en
    Décembre 2003
    Messages
    1 946
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 946
    Par défaut
    Citation Envoyé par cubepiege
    Sinon pour media l'erreur est la même ca ne peux pas marcher comme çà, car il y plusieurs resultats retournés
    Et dans ce cas quelle est la bonne ?

  10. #10
    Membre confirmé Avatar de cubepiege
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    161
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 161
    Par défaut
    LOL je suis le premier interessé pour le savoir!

  11. #11
    Membre confirmé Avatar de cubepiege
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    161
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 161
    Par défaut
    Bon j'ai essaye plein de trucs...

    MEDIA j'ai essayer aussi avec ton script mais ca na fonctionne pas non plus.

    Peut etre y a t-il une autre technique pour arriver a mes fins.
    Quelqu'un a une idée?
    Merci

  12. #12
    Membre expérimenté Avatar de souellet
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    155
    Détails du profil
    Informations personnelles :
    Âge : 56
    Localisation : Canada

    Informations forums :
    Inscription : Juillet 2003
    Messages : 155
    Par défaut
    SELECT DISTINCT dans ta sous-requête?

  13. #13
    Xo
    Xo est déconnecté
    Membre Expert
    Avatar de Xo
    Inscrit en
    Janvier 2005
    Messages
    2 701
    Détails du profil
    Informations personnelles :
    Âge : 52

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 701
    Par défaut
    Citation Envoyé par Médiat
    Et dans ce cas quelle est la bonne ?
    Citation Envoyé par cubepiege
    LOL je suis le premier interessé pour le savoir!
    Si toi tu ne sais pas, nous ne pourrons pas le deviner. Cela dépend des fonctionnalités de ton logiciel.

    Citation Envoyé par cubepiege
    MEDIA j'ai essayer aussi avec ton script mais ca na fonctionne pas non plus.
    Erreur rencontrée ? Si oui, description ? Si non, qu'est ce qui ne va pas ?

    Pour info, ton interlocuteur se nomme Médiat et pas media, je sais bien qu'il est prolixe, mais tout de même
    "Ce que l'on conçoit bien s'énonce clairement,
    Et les mots pour le dire arrivent aisément." Nicolas Boileau

    "Expliquer empêche de comprendre si cela dispense de chercher"

    Quiz Oracle : venez tester vos connaissances !

    La FAQ Oracle : 138 réponses à vos questions
    Aidez-nous à la compléter

  14. #14
    Membre confirmé Avatar de cubepiege
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    161
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 161
    Par défaut
    lol desole pour le T (mediat)
    Et bien j'ai la meme erreur me disant

    "La sous requete a generée plusieures valeurs, cela n'est pas autorisé quand la sous requete suit =, !=, etc... ou quand elle st utilisée en tant qu'expression"

  15. #15
    Inactif   Avatar de Médiat
    Inscrit en
    Décembre 2003
    Messages
    1 946
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 946
    Par défaut
    Citation Envoyé par Xo
    Pour info, ton interlocuteur se nomme Médiat et pas media, je sais bien qu'il est prolixe, mais tout de même


    Citation Envoyé par cubepiege
    desole pour le T (mediat)
    Pas grave, mais avec accent... aigu !

    Citation Envoyé par Xo
    Si toi tu ne sais pas, nous ne pourrons pas le deviner. Cela dépend des fonctionnalités de ton logiciel.
    Tout est dit !

    On peut envisager plusieurs cas :
    • Tous les Id renvoyés sont les mêmes : DISTINCT devrait régler le problème.
      Les Id sont différents, et tu veux le plus grand ou le plus petit, ou tu t'en fous : SELECT MAX(UNIQUEID2.ID_PERSONA), ou SELECT MIN(UNIQUEID2.ID_PERSONA)
      Les Id sont tous différents, mais tu ne sais pas quel est le bon : et ben nous non plus !

  16. #16
    Membre confirmé Avatar de cubepiege
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    161
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 161
    Par défaut
    en fait les id sont generes au hasard par un moteur et en attribue un pour chaque personne defini par ID NOM PRENOM DATE DE NAISSANCE dans mes deux tableaux UNIQUEID1 et UNIQUEID2.
    A la limite on peut oublier UNIQUEID2.
    J'explique:
    On a cette table ANAGPERSTESTREP qui contient sur chaque champs ces infos (1 champ par user)
    dans UNIQUEID1 on a les memes infos mais avec un id different car ces donnes sont issues d'un autre process de calcul (bref...), ce que je veux faire est remettre a jour les ID(anciens) contenus dans ANAGPERSTESTREP par les id contenus dans UNIQUEID1.
    C'est simple je compare les champs dans UNIQUEID1 et ceux de ANAGPERSTESTREP et si il y a bien correspondance entre NOM PRENOM et DATE DE NAISSANCE alors je prend le nouveau ID attribue au user dans UNIQUEID1 et remplace l'ancien contenu dans ANAGPERSTESTREP(pour le meme user).
    Voila

  17. #17
    Inactif   Avatar de Médiat
    Inscrit en
    Décembre 2003
    Messages
    1 946
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 946
    Par défaut
    Essaye :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    UPDATE ANAGPERSTESTREP 
    SET    ID_PERSONA = (SELECT MIN(UNIQUEID1.ID_PERSONA)
                         FROM UNIQUEID1 
                         WHERE UNIQUEID1.DES_COGNOMEPERS = ANAGPERSTESTREP.DES_COGNOMEPERS 
                           AND UNIQUEID1.DES_NOMEPERS    = ANAGPERSTESTREP.DES_NOMEPERS 
                           AND UNIQUEID1.DTA_NASCITAPERS = ANAGPERSTESTREP.DTA_NASCITAPERS)  
    WHERE EXISTS (SELECT UNIQUEID1.ID_PERSONA 
                  FROM UNIQUEID1 
                  WHERE UNIQUEID1.DES_COGNOMEPERS = ANAGPERSTESTREP.DES_COGNOMEPERS 
                    AND UNIQUEID1.DES_NOMEPERS    = ANAGPERSTESTREP.DES_NOMEPERS 
                    AND UNIQUEID1.DTA_NASCITAPERS = ANAGPERSTESTREP.DTA_NASCITAPERS)

  18. #18
    Membre confirmé Avatar de cubepiege
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    161
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 161
    Par défaut
    YEPE!! ca marche impec!
    Merci beaucoup tu m'enleve une poutre du pied là!

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

Discussions similaires

  1. problème de syntaxe avec champ date
    Par mussara dans le forum SQL Procédural
    Réponses: 4
    Dernier message: 03/02/2006, 16h19
  2. Erreur de syntaxe avec UPDATE
    Par tyarak dans le forum Requêtes
    Réponses: 3
    Dernier message: 01/02/2006, 01h18
  3. pb de syntaxe avec le "select"
    Par dipajero dans le forum Bibliothèques tierces
    Réponses: 5
    Dernier message: 04/01/2006, 15h40
  4. [Tableaux] simple syntaxe avec $_REQUEST
    Par nicerico dans le forum Langage
    Réponses: 3
    Dernier message: 18/10/2005, 16h01
  5. [langage] Pb de syntaxe avec GOTO
    Par BEAUJAULT dans le forum Langage
    Réponses: 2
    Dernier message: 14/10/2004, 16h02

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