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 :

UPDATE + WITH


Sujet :

SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé

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

    Informations forums :
    Inscription : Novembre 2005
    Messages : 385
    Par défaut UPDATE + WITH
    Bonjour à tous,

    est-il possible d'utiliser une clause with dans une requête de mise à jour :

    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
     
    WITH 
      MY_VIEW AS (
        SELECT *
        FROM PERSONNES
      ),
      MY_VIEW2 AS (
        SELECT MY_KEY, COUNT(*) AS NB_PERSONNES
        FROM MY_VIEW
        GROUP BY MY_KEY
      )
     
    UPDATE DUAL d
    SET d.MY_FIELD = mv.NB_PERSONNES
    FROM MY_VIEW2 mv
    WHERE d.MY_KEY = mv.MY_KEY
    ou


    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
     
    UPDATE DUAL d
    SET d.MY_FIELD = 
      (
        WITH 
          MY_VIEW AS (
            SELECT *
            FROM PERSONNES
          ),
          MY_VIEW2 AS (
            SELECT MY_KEY, COUNT(*) AS NB_PERSONNES
            FROM MY_VIEW
            GROUP BY MY_KEY
          )
     
         SELECT NB_PERSONNES
         FROM MY_VIEW2 mv
         WHERE mv.MY_KEY = d.MY_KEY
      )

  2. #2
    Membre éclairé

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

    Informations forums :
    Inscription : Novembre 2005
    Messages : 385
    Par défaut
    J'ai réussi à faire une requête de mise en me passant du WITH.

  3. #3
    Expert éminent
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Par défaut
    tu pourrais la poster STP ?

  4. #4
    Membre éprouvé
    Profil pro
    Inscrit en
    Février 2006
    Messages
    139
    Détails du profil
    Informations personnelles :
    Âge : 50
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Février 2006
    Messages : 139
    Par défaut
    Bonjour,

    Pour se passer du with, on peut ajouter rownum>0 dans la sous requete pour forcer son évaluation en premier.
    Sinon il y a les hints PUSH_PRED ou PUSH_SUBQ qui peuvent rendre les memes services.

    Cdt

  5. #5
    Membre éclairé

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

    Informations forums :
    Inscription : Novembre 2005
    Messages : 385
    Par défaut
    Citation Envoyé par orafrance Voir le message
    tu pourrais la poster STP ?
    j'ai simplement dupliqué mes requêtes dans des sous-requêtes au lieu de les centraliser au sein d'un bloc WITH. Voici ma requête, mais je pense qu'elle n'apportera rien

    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
     
    UPDATE [MA_TABLE] m
    SET m.[MON_CHAMP]  = 
      (
          SELECT 
                CASE 
                    WHEN FIELD1 = '[VALEUR_TEST]' 
                      THEN decode(RANG,1,1,4)                  
                      ELSE decode(RANG,1,1,3) 
                END
          FROM (
                  SELECT [KEY], m1.FIELD1, m1.FIELD2, m1.FIELD3, m1.FIELD4,
                         CASE
                            WHEN m1.CTR_ORI_COD = '[VALEUR_TEST]' 
                              THEN 
                                (RANK() OVER (PARTITION BY m1.FIELD1, m1.FIELD2, m1.FIELD3, m1.FIELD4 ORDER BY m1.[KEY] DESC))                        
                              ELSE
                                (RANK() OVER (PARTITION BY m1.FIELD1, m1.FIELD2, m1.FIELD3, m1.FIELD4 ORDER BY m1.[KEY] ASC)) 
                         END as RANG
                  FROM [MA_TABLE] m1, 
                       (                        
                          SELECT FIELD1, FIELD2, FIELD3, IELD4, count([KEY]) as NB_KEYS
                          FROM [MA_TABLE]
                          GROUP BY FIELD1, FIELD2, FIELD3, FIELD4
                          HAVING count([KEY]) > 1
                       ) m2
                  WHERE m1.FIELD1 = m2.FIELD1
                    AND m1.FIELD2 = m2.FIELD2
                    AND m1.FIELD3 = m2.FIELD3 
                ) md
           WHERE md.[KEY] = m.[KEY]                
      )
    WHERE EXISTS (
        SELECT 1
        FROM (
                SELECT m1.[KEY] as DOUBLON
                FROM [MA_TABLE] m1, 
                     (                        
                        SELECT FIELD1, FIELD2, FIELD3, FIELD4, count([KEY]) as NB_KEYS
                        FROM [MA_TABLE]
                        GROUP BY FIELD1, FIELD2, FIELD3, FIELD4
                        HAVING count([KEY]) > 1
                     ) m2
                WHERE m1.FIELD1 = m2.FIELD1
                  AND m1.FIELD2 = m2.FIELD2
                  AND m1.FIELD3 = m2.FIELD3 
             ) 
        WHERE [KEY] = DOUBLON 
    )

    Par contre, j'aimerais bien savoir s'il est possible d'utiliser la clause WITH dans un update...

  6. #6
    Expert éminent
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Par défaut
    je crains que non

  7. #7
    Expert confirmé
    Avatar de laurentschneider
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2005
    Messages
    2 944
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Finance

    Informations forums :
    Inscription : Décembre 2005
    Messages : 2 944
    Par défaut
    je crains que oui

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    SQL> create table t as select 1 x from dual
    Table created.
    SQL> update t set x=(with v as(select 2 y from dual)select * from v)
    1 row updated.
    SQL> commit
    Commit complete.
    SQL> select * from t
     
             X
    ----------
             2

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 07/05/2015, 15h02
  2. Réponses: 1
    Dernier message: 23/06/2014, 15h04
  3. [Débutant] Insert, Update, Search and Delete (CRUD operation) with SharePoint 2013 using VS 2012
    Par siffon dans le forum Développement Sharepoint
    Réponses: 2
    Dernier message: 17/02/2014, 12h22
  4. Utiliser WITH dans un INSERT / UPDATE
    Par GoLDoZ dans le forum SQL
    Réponses: 5
    Dernier message: 24/02/2011, 10h38
  5. update statistics with sampling
    Par thx5959 dans le forum Adaptive Server Enterprise
    Réponses: 1
    Dernier message: 28/09/2009, 06h34

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