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 :

Mise à jour d'une table à partir d'une requête


Sujet :

SQL Oracle

  1. #1
    Membre averti

    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    385
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 385
    Points : 321
    Points
    321
    Par défaut Mise à jour d'une table à partir d'une requête
    Bonjour à tous,

    j'aimerais savoir si il est possible de mettre à jour une table à partir d'une requête. Voici un exemple de ce que je veux faire :

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    UPDATE (SELECT t1.* FROM t1,t2 WHERE t1.champ1 = t2=champ1)
    SET champ2 = 4

    Ce que je voudrais donc faire c'est attribuer la valeur au champ "champ2" de la table t1 uniquement pour les enregistrements de t1 présents dans t2. Cette requête est-elle valide ?

    Sinon une requête fonctionnant mais prenant beaucoup trop de temps :

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    UPDATE t1
    SET champ2 = 4
    WHERE EXISTS (
       SELECT 1
       FROM t2 
       WHERE t1.champ1 = t2=champ1
    )

  2. #2
    Membre éprouvé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    861
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 861
    Points : 965
    Points
    965
    Par défaut
    Le premier type de requête n'accepte pas les jointures je crois.
    Ta seconde requête avec exists est souvent la meilleure solution.
    La vraie question est de savoir pourquoi ça prend 'beaucoup trop de temps'.
    Qu'appelles tu 'beaucoup trop de temps'?
    Des infos sur la volumétrie, la structure des tables, les index, l'explain plan ... pourraient aider.

  3. #3
    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
    Précisez la version d'Oracle!
    Affichez le plan d'exécution.
    Essayez avec un IN à la place du Exists.

  4. #4
    Membre averti

    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    385
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 385
    Points : 321
    Points
    321
    Par défaut
    Merci pour vos réponses.

    Je voulais juste savoir ma solution #1 était syntaxiquement correcte mais apparemment non. Je vais donc conserver ma seconde solution.

    Je ne peux pas utiliser un IN en raison du nombre de résultats retourné par la requête t2. La clause "EXISTS" est donc la seule solution.

  5. #5
    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
    Citation Envoyé par erwan.bodere Voir le message
    ...
    Je ne peux pas utiliser un IN en raison du nombre de résultats retourné par la requête t2. La clause "EXISTS" est donc la seule solution.
    Peux tu expliquer ?
    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
     
    SQL> select count(owner)
      2  from big;
     
    COUNT(OWNER)
    ------------
         3195392
     
    SQL> select *
      2  from dual
      3  where 'SYSTEM' in (select owner from big);
     
    D
    -
    X

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

Discussions similaires

  1. Réponses: 7
    Dernier message: 22/06/2012, 12h12
  2. Réponses: 5
    Dernier message: 19/03/2008, 10h41
  3. [Tables] Update d'une table à partir d'une autre
    Par le_niak dans le forum VBA Access
    Réponses: 2
    Dernier message: 17/01/2008, 09h01
  4. copie d'une table Y d'une base A vers une table X d'une base
    Par moneyboss dans le forum PostgreSQL
    Réponses: 1
    Dernier message: 30/08/2005, 21h24
  5. Réponses: 5
    Dernier message: 06/01/2005, 12h07

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