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

Développement SQL Server Discussion :

[SQL SERVER 2K5] Update et Rank Over


Sujet :

Développement SQL Server

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Octobre 2007
    Messages
    67
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 67
    Par défaut [SQL SERVER 2K5] Update et Rank Over
    Bonjour à tous,
    Je cherche une solution pour mettre à jour une table.

    J'ai une requête SELECT :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT POLICE_ID, RIDER_ID, CUSTOMER_MATCH_KEY, CUSTOMER_TYPE_NUMBER, PRODUCT_FLAG,
    RANK() OVER(PARTITION BY POLICE_ID ORDER BY POLICE_ID, RIDER_ID, CUSTOMER_MATCH_KEY, CUSTOMER_TYPE_NUMBER) AS Rank
    FROM dbo.PRODUCT_PER_CUSTOMER
    qui me donne pour chaque regroupement un Rank de 1 à N

    J'aimerais pouvoir mettre à jour un champ pour toute les lignes où le Rank est à 1

    merci d'avance

  2. #2
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Par défaut
    Bonjour

    Dans votre requête UPDATE, faites une jointure entre votre table et votre requête (sous forme de pseudo table ou de CTE), sur la clef primaire de la table, puis filtrez dans la clause WHERE sur Rank = 1

  3. #3
    Membre confirmé
    Inscrit en
    Octobre 2007
    Messages
    67
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 67
    Par défaut
    Merci beaucoup pour votre réponse.
    Cela fonctionne parfaitement bien
    La solution :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    with r_SomeTable
    as
    (
    SELECT POLICE_ID, RIDER_ID, CUSTOMER_MATCH_KEY, CUSTOMER_TYPE_NUMBER, PRODUCT_FLAG, RANK() OVER(PARTITION BY POLICE_ID,CUSTOMER_MATCH_KEY ORDER BY POLICE_ID, RIDER_ID, CUSTOMER_MATCH_KEY, CUSTOMER_TYPE_NUMBER) AS Rnk
    FROM dbo.PRODUCT_PER_CUSTOMER
    )
    update r_SomeTable
    set PRODUCT_FLAG = '1'
    where Rnk = '1'

  4. #4
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Par défaut
    En effet, même pas besoin de jointure

    Certaines colonnes dans votre CTE ne sont pas utiles non plus.

    et ça devient :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    WITH  r_SomeTable
    AS(
    	SELECT 
    		PRODUCT_FLAG, 
    		RANK() OVER(
    			PARTITION BY POLICE_ID,CUSTOMER_MATCH_KEY 
    			ORDER BY POLICE_ID, RIDER_ID, CUSTOMER_MATCH_KEY, CUSTOMER_TYPE_NUMBER
    		) AS Rnk
    	FROM dbo.PRODUCT_PER_CUSTOMER
    )
    UPDATE	r_SomeTable
    SET PRODUCT_FLAG = '1'
    WHERE	Rnk = 1

  5. #5
    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
    La fonction rank() renvoie un entier, il faut respecter le type :

  6. #6
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Par défaut
    En effet, merci Waldar
    Je corrige dans mon post...

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

Discussions similaires

  1. [SQL Server 2K5] Ecriture d'UPDATE
    Par achestyx dans le forum Développement
    Réponses: 2
    Dernier message: 23/07/2009, 11h46
  2. [SQL SERVER 2k5]Trigger update instead of sur vue
    Par qlaimand dans le forum Développement
    Réponses: 0
    Dernier message: 18/06/2008, 17h06
  3. [SQL Server 2000] UPDATE sur tous les champs de ma table
    Par neeux dans le forum Langage SQL
    Réponses: 8
    Dernier message: 11/12/2006, 10h13
  4. Réponses: 3
    Dernier message: 06/07/2006, 09h47
  5. [SQL Server] Requete update sur 2 champs
    Par galou10 dans le forum Langage SQL
    Réponses: 2
    Dernier message: 21/02/2006, 20h22

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