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 Oracle Discussion :

Sous-requete dans un update Oracle


Sujet :

SQL Oracle

  1. #1
    Nouveau membre du Club
    Inscrit en
    Août 2008
    Messages
    62
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 62
    Points : 33
    Points
    33
    Par défaut Sous-requete dans un update Oracle
    Bonjour à tous,

    Voila mon problème j'ai une table temporaire (with) qui me ramene des id et qui fonctionne tres bien (si je fais un select dessus il n'y a aucun pb)
    Ensuite, je voudrais mettre a jour un champ d'une table pour lequel l'ID correspondant ne se trouve pas dans les resultats ramené par cette table temporaire...
    Voici donc ma requete:

    with TEMP as(
    select J.ID theId
    from USER.JOURNAL J inner join USER.DATA T on T.JOURNALID=J.ID where J.DATEMODIFICATION not in (select temps.datemodif from USER.DATATIME temps))
    update USER.DATA T
    set T.FLAG=2
    where T.JOURNALID in (select temporaire.theId from TEMP temporaire)

    Or, lorsque je l'execute, j'obtients l'erreur ORACLE suivante:
    Error: ORA-00928: missing SELECT keyword

    Par contre si j'enleve la ligne
    where T.JOURNALID in (select temporaire.theId from TEMP temporaire)

    Alors ca marche mais bien sur tous mes champs FLAG sont updatés à "2" et ce n'est vrament pas ce que je veux...

    Merci bcp de votre aide car je ne vois pas du tout comment faire...

    Thomas

  2. #2
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Customer Success Manager @Vertica
    Inscrit en
    Septembre 2008
    Messages
    8 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Customer Success Manager @Vertica
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 452
    Points : 17 820
    Points
    17 820
    Par défaut
    Certes, mais là vous cherchez à faire compliqué alors que vous pouvez faire simple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    update USER.DATA
       set FLAG =  2
     where JOURNALID in (select ID
                           from USER.JOURNAL
                          where DATEMODIFICATION not in (select datemodif from USER.DATATIME));
    Une sélection et une mise à jour ne sont pas la même chose, et ne sont donc pas à traiter de la même façon.

  3. #3
    Nouveau membre du Club
    Inscrit en
    Août 2008
    Messages
    62
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 62
    Points : 33
    Points
    33
    Par défaut
    Merci de votre aide, mais en fait j'avais voulu simplifier mais je pense que le probleme vient de la requete temporaire:
    with TEMP as(
    select J.ID theId
    from USER.JOURNAL J inner join USER.DATA T on T.JOURNALID=J.ID where J.DATEMODIFICATION not in (select temps.datemodif from USER.DATATIME temps))

    A vrai dire elle est en realité comme cela:

    with TEMP as(
    select J.ID theId
    from USER.JOURNAL J inner join USER.DATA T on T.JOURNALID=J.ID where J.DATEMODIFICATION not in (select temps.datemodif from TEMPINIT temps))

    où TEMPINIT est une autre table temporaire (with) qui m'a permis de recuperer des champs de plusieurs table auparavant...
    Encore Merci,

    Thomas

  4. #4
    Expert éminent sénior Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5 611
    Points : 11 252
    Points
    11 252
    Par défaut
    With n’est pas une table temporaire mais plutôt une « vue ad hoc » (in line view). Postez votre requête en entière, en utilisant les balises code, parce que dans votre exemple TEMPINIT n’est pas defini avec un with.

  5. #5
    Nouveau membre du Club
    Inscrit en
    Août 2008
    Messages
    62
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 62
    Points : 33
    Points
    33
    Par défaut
    Ok voila ma requete complete:
    Code sql : 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
     
    with TEMPINIT as(
    select
    B.KEY theKey,
    MAX(F.DATEMODIFICATION) dateMax
    from user.data B,user.journal F 
    where F.ID=B.JOURNALID
    group by
    B.KEY,
    F.DOCUID),
    TEMPINIT2 as(
    select
    B.KEY,
    B.VALUE,
    B.DATEEMISSION,
    B.FLAG,
    F.DOCUID,
    F.DATEMODIFICATION datemodif
    from user.data B,user.journal F,TEMPINIT G
    where B.KEY=G.theKey and F.DATEMODIFICATION=G.dateMax
    and F.ID=B.JOURNALID
    Order by F.DOCUID desc)
    update user.DATA T
    set T.FLAG=2
    where T.JOURNALID in (select J.ID from user.JOURNAL from user.JOURNAL J inner join user.DATA T on T.JOURNALID=J.ID where J.DATEMODIFICATION not in (select temp.datemodif from TEMPINIT2 temp))

    Et cette requete me renvoi
    Error: ORA-00928: missing SELECT keyword

    Je ne vois vraiment pas pourquoi...
    Merci de votre aide

  6. #6
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Customer Success Manager @Vertica
    Inscrit en
    Septembre 2008
    Messages
    8 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Customer Success Manager @Vertica
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 452
    Points : 17 820
    Points
    17 820
    Par défaut
    Vous avez remarqué que dans votre première CTE le group by contient un élément qui n'est pas sélectionné ?
    Ce n'est pas faux, mais il faut que vous soyez conscient de l'impact que celà peut avoir.

    L'order by dans la deuxième CTE n'a pas vraiment de sens, il n'y a pas de sélection donc pas de tri non plus. Retirez-le.

    Par contre, je pense que ce que vous écrivez est trop compliqué par rapport à ce que vous désirez faire.

    Vous souhaitez, si j'ai bien lu la requête, flagger à 2 tous les éléments de DATA dont la date de modification de JOURNAL n'est pas la dernière ?

  7. #7
    Nouveau membre du Club
    Inscrit en
    Août 2008
    Messages
    62
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 62
    Points : 33
    Points
    33
    Par défaut
    Ok merci de votre aide...
    En gros je souhaite flagguer a 2 les flag qui ne correspondent pas au lignes prisent grace aux 2 with precedent.
    Soit, les lignes n'ayant pas des dates max dans le cas où des key sont identiques pour un mm docUID.
    Merci bcp de votre aide,

    Thomas

Discussions similaires

  1. [SQL Server] Sous Requete dans le select
    Par Le Singe dans le forum Langage SQL
    Réponses: 2
    Dernier message: 07/11/2006, 09h11
  2. Utiliser Resultat D4une Sous Requete Dans Un Select
    Par loiseaud dans le forum Langage SQL
    Réponses: 2
    Dernier message: 29/08/2006, 11h42
  3. [Access 97] plusieurs sous requetes dans requetes!!!
    Par T'chab dans le forum Langage SQL
    Réponses: 2
    Dernier message: 03/05/2006, 14h07
  4. [SQL-Server] Sous requete dans une procédure stockée
    Par Worldofdada dans le forum MS SQL Server
    Réponses: 6
    Dernier message: 09/02/2006, 11h18
  5. Sous-requete dans un etat
    Par kbh dans le forum Access
    Réponses: 5
    Dernier message: 09/11/2005, 09h05

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