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 where rownum


Sujet :

SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Juin 2002
    Messages
    203
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

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

    Informations forums :
    Inscription : Juin 2002
    Messages : 203
    Par défaut Update where rownum
    Bonjour tous le monde,

    Je teste une méthode d'anonymisation, et j'aurai besoin d'un coup de main pour écrire ma requete:

    J'ai une table CLIENT:
    NOM | Prenom | etc...

    et une table ANON
    NOM | Prenom | etc...

    J'aimerai mettre a jour le champ CLIENT.NOM avec les données de ANON.NOM en faisant correspondre les rownum de CLIENT et de ANON.

    J'ai trouvé une méthode, mais en passant par une table de travail, ce que j'aimerais éviter.

    J'ai vu plusieurs scripts avec MERGE, mais il y a toujours le problème d’existence du rownum lors du ON.

    Auriez vous une idée ?

  2. #2
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 454
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 454
    Par défaut
    rownum est une pseudo colonne évaluée à chaque requête, ce n'est absolument pas déterministe.

  3. #3
    Membre confirmé
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Juin 2002
    Messages
    203
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

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

    Informations forums :
    Inscription : Juin 2002
    Messages : 203
    Par défaut
    C'est justement le but.
    je comptais mettre de coté les 2 requêtes avec le rownum dans un WITH, et les lier pour l'UPDATE.

  4. #4
    McM
    McM est déconnecté
    Expert confirmé

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Billets dans le blog
    4
    Par défaut
    Dans ce cas, il faut aliaser la column ROWNUM

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    WITH t1 AS (SELECT ROWNUM num, CHR(LEVEL + 64) b FROM dual connect BY LEVEL < 5),
    t2 AS (SELECT ROWNUM num, CHR(LEVEL + 96) b FROM dual connect BY LEVEL < 5)
    SELECT *
    FROM t1, t2
    WHERE t1.num = t2.num
     
     
    NUM	B	NUM_1	B_1
    1	"A"	1	"a"
    2	"B"	2	"b"
    3	"C"	3	"c"
    4	"D"	4	"d"

  5. #5
    Membre confirmé
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Juin 2002
    Messages
    203
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

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

    Informations forums :
    Inscription : Juin 2002
    Messages : 203
    Par défaut
    mon objectif est d'anonymiser des données, donc pas besoin d'identifier les colonnes, je veux simplement qu'elle soient différentes en se basant sur ma table ANON.
    Ma table client peut avoir différent type de PK (plusieurs databases), c'est pourquoi je ne peux pas me baser dessus.

    ma méthode en utilisant la table de travail (sur le shéma SCOTT) est:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    CREATE TABLE ANON.TEST_EMP AS 
    WITH A AS (SELECT ROWNUM ID, ENAME FROM SCOTT.EMP),
    B AS (SELECT ROWNUM ID, NOM FROM ANON.ANON)
    SELECT A.ID , A.ENAME, B.NOM
    FROM A, B WHERE A.ID = B.ID
     
     
    UPDATE SCOTT.EMP A
    SET A.ENAME = (SELECT B.NOM FROM ANON.TEST_EMP B WHERE A.ENAME = B.ENAME)
    WHERE EXISTS (SELECT 1 FROM ANON.TEST_EMP B WHERE A.ENAME = B.ENAME);

  6. #6
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 454
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 454
    Par défaut
    Quel est l'intérêt de votre solution par rapport à :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    update Matable
       set Nom    = null
         , Prenom = null;
    Ou encore :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    update Matable
       set Nom    = dbms_random.string('a', length(Nom))
         , Prenom = dbms_random.string('a', length(Prenom));
    Il y a quelque chose qui m'échappe dans votre besoin.

  7. #7
    Membre Expert
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Avril 2013
    Messages
    2 005
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2013
    Messages : 2 005
    Par défaut
    Idem que Waldar : évite rownum pour des UPDATE ou DELETE car ce n'est pas un identifiant de la base mais une pseudo-colonne.

    Quelles sont les PK des deux tables? Pourquoi ne pas les utiliser?
    Et quelle était ta solution passant par une table intermédiaire?

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

Discussions similaires

  1. Update Where not Exists
    Par wclef dans le forum Langage SQL
    Réponses: 4
    Dernier message: 09/03/2010, 10h50
  2. optimisation d'un update where(select)
    Par nimbus_77 dans le forum Requêtes
    Réponses: 5
    Dernier message: 02/07/2008, 12h38
  3. select --> update ou update where !=
    Par Kiroukool dans le forum SQL
    Réponses: 4
    Dernier message: 22/04/2008, 10h13
  4. Utilisation de UPDATE .. WHERE CURRENT OF
    Par Acivurt dans le forum PostgreSQL
    Réponses: 0
    Dernier message: 08/03/2008, 14h14
  5. Probleme Merge a cause du UPDATE WHERE
    Par Flipmode dans le forum SQL
    Réponses: 6
    Dernier message: 27/06/2007, 18h27

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