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 :

dense_rank() dans un update


Sujet :

Langage SQL

  1. #1
    Membre régulier
    Inscrit en
    Janvier 2004
    Messages
    242
    Détails du profil
    Informations forums :
    Inscription : Janvier 2004
    Messages : 242
    Points : 84
    Points
    84
    Par défaut dense_rank() dans un update
    Bonjour,

    j'ai une table de ce type :

    idParcelle
    idProprietaire

    Il peut y avoir plusieurs proprietaires pour chaque parcelle.

    Nous voulons ajouter un champ Numero (integer). Pour la reprise d'historique, il faudrait initialiser ce champ en incrementant celui cen fonction du nombre de proprietaire pour chaque parcelle.

    Exemple
    idParcelle ---------- idProprietaire -------- Numéro
    1 ----------------------1------------------ 1
    1 ----------------------2------------------ 2
    1 ----------------------3------------------ 3
    2 ----------------------1------------------ 1
    3 ----------------------1------------------ 1
    3 ----------------------4------------------ 2

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SELECT   
    	         cur_par,cur_tie,dense_rank() over(partition BY cur_par ORDER BY cur_tie) DENSE_RNK
    	FROM
    	   (
    	      SELECT   prop2.cur_par,prop2.cur_tie
    	      FROM     grpe_parcelle_proprietaire prop2
    		  GROUP BY prop2.cur_par,prop2.cur_tie
    	   )
    maintenant, mon problème se pose pour faire l'update du champ numero pour toute la table.

    il faudrait que je fasse un truc genre

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    UPDATE grpe_parcelle_proprietaire prop1 SET NUMERO = (
     
    	SELECT   
    	         dense_rank() over(partition BY cur_par ORDER BY cur_tie) DENSE_RNK
    	FROM
    	   (
    	      SELECT   prop2.cur_par,prop2.cur_tie
    	      FROM     grpe_parcelle_proprietaire prop2
    		  GROUP BY prop2.cur_par,prop2.cur_tie
    	   )
    	   WHERE prop2.CUR_PAR = prop1.cur_par AND prop2.cur_tie = prop1.cur_tie    
    )
    mais je n'ai biensur pas accès à prop1 dans ma requete imbriquée...

    Pour l'instant, j'ai trouvé une parade en créant une table temporaire avec les données de mon ancienne table puis j'ai supprimé mon ancienne table et renommer la nouvelle.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    CREATE TABLE GRPE_PARCELLE_PROPRIETAIRE_T AS 
     
    SELECT CUR_TIE,CUR_PAR,TPO_ID,OBSERVATIONS_PROPRIETAIRE,CUR_PMPA,dense_rank() over(partition BY cur_par ORDER BY cur_tie) NUMERO
    	FROM
    	   (
    	      SELECT   *
    	      FROM     GRPE_PARCELLE_PROPRIETAIRE prop
     
    	   )
    	   ;
     
    DROP TABLE GRPE_PARCELLE_PROPRIETAIRE;
     
    ALTER TABLE GRPE_PARCELLE_PROPRIETAIRE_T RENAME TO GRPE_PARCELLE_PROPRIETAIRE;
    Mais c'est tres long à se lancer ( environ 3 minutes)

    Je préfererais utiliser un script d'update...

    Merci

  2. #2
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 875
    Points : 53 053
    Points
    53 053
    Billets dans le blog
    6
    Par défaut
    Utilisez de préférence ROW_NUMBER()

    Suivant le SGBDR vous pouvez utiliser un ROW VALUE CONSTRUCTOR ou une table implicitement corrélée pour faire vos mises à jour.

    A +

  3. #3
    Membre régulier
    Inscrit en
    Janvier 2004
    Messages
    242
    Détails du profil
    Informations forums :
    Inscription : Janvier 2004
    Messages : 242
    Points : 84
    Points
    84
    Par défaut
    Je ne vois pas vraiment le but d'utiliser row number sachant que ma requete avec dense rank() fonctionne, pourquoi l'utilisation de row number serait mieux pour ma requete d'update ?

    Je ne comprends pas non plus comment je pourrais utiliser le row value constructor dans mon cas ..

  4. #4
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 875
    Points : 53 053
    Points
    53 053
    Billets dans le blog
    6
    Par défaut
    ROW_NUMBER à besoin de moins de ressource.
    Le Row Value Constructor est utilisé par certains SGBDR pour la mise à jour des données en sous requête corrélée. Tout dépend de votre SGBDR !

    A +

  5. #5
    Membre régulier
    Inscrit en
    Janvier 2004
    Messages
    242
    Détails du profil
    Informations forums :
    Inscription : Janvier 2004
    Messages : 242
    Points : 84
    Points
    84
    Par défaut
    Nous utilisons oracle donc les row value selector fonctionne mais je ne vois pas comment je peux faire pour les utiliser dans mon cas.
    Vous avez un exemple ?

  6. #6
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 875
    Points : 53 053
    Points
    53 053
    Billets dans le blog
    6
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    UPDATE MaTable
    SET    Numero = (SELECT ROW_NUMBER() OVER(PARTITION BY idParcelle ORDER BY idProprietaire)
                     FROM   MaTable AS T1
                     WHERE  T1.(idParcelle, idProprietaire) = (idParcelle, idProprietaire))
    Pour de plus amples informations sur l'utilisation du Row Value Constructor, lisez mon ouvrage du SQL : http://www.amazon.fr/SQL-1C%C3%A9d%C...2462194&sr=1-1

    A +

Discussions similaires

  1. Plusieur Condition dans REquette UPDATE
    Par ducseb dans le forum Langage SQL
    Réponses: 12
    Dernier message: 11/08/2005, 11h46
  2. Mette a jour 2 colonnes dans un UPDATE??
    Par Devil666 dans le forum Langage SQL
    Réponses: 3
    Dernier message: 19/07/2005, 15h02
  3. REPLACE dans un UPDATE
    Par outdial dans le forum Requêtes
    Réponses: 3
    Dernier message: 20/09/2004, 11h00
  4. Une ch'tite bizarrerie dans les Updates de SQL Server
    Par Wakko2k dans le forum MS SQL Server
    Réponses: 12
    Dernier message: 08/04/2004, 14h14
  5. GROUP BY et HAVING dans un UPDATE
    Par MashiMaro dans le forum Langage SQL
    Réponses: 3
    Dernier message: 26/08/2003, 08h03

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