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 :

[2005 Express] un Update sur un top avec des clauses Where


Sujet :

Développement SQL Server

  1. #1
    Membre extrêmement actif
    Avatar de zooffy
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Août 2004
    Messages
    3 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Chef de projet MOA
    Secteur : Bâtiment

    Informations forums :
    Inscription : Août 2004
    Messages : 3 895
    Points : 1 434
    Points
    1 434
    Par défaut [2005 Express] un Update sur un top avec des clauses Where
    Bonjour

    Je crois bien que mon problème est simple, mais je cale un peu.

    Je voudrais faire un Update sur une table, en fait sur une partie des enregistrement qui réponde à une clause Where. Jusque là, je sais faire.
    Masi le truc c'est qu'il faut faire un TOP avec un ORDER BY pour en prendre que les 5 premiers, une fois triés, même si les suivantes répondent à la clause Where.

    Et là, je sèche.

    Pour l'instant j'en sius là :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    UPDATE
    (SELECT TOP 5 * FROM dbo.MEET_User_SpeedDating WHERE SD_Id = @Session 
    	ORDER BY USD_Date_Inscription) AS T
    SET USD_Statut = 1
    Et il veux rien savoir de plus.

    Pouvez vous m'aider ?
    Mon blog de création d'univers : Qualhiryann
    Mon site qui parle de moi www.ozouf.com
    Pour les joueurs de WOW je suis sur Ysondres et mon perso est Ablanore.

  2. #2
    Expert éminent sénior
    Avatar de mikedavem
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2005
    Messages
    5 450
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Ain (Rhône Alpes)

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

    Informations forums :
    Inscription : Août 2005
    Messages : 5 450
    Points : 12 891
    Points
    12 891
    Par défaut
    Bonjour,

    Ne connaissant pas la structure de vos table je vous met un exemple que vous devez adapter :

    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
    CREATE TABLE t
    (
     ID INT
    );
     
    INSERT INTO t VALUES (1);
    INSERT INTO t VALUES (2);
    INSERT INTO t VALUES (3);
    INSERT INTO t VALUES (4);
    INSERT INTO t VALUES (5);
    INSERT INTO t VALUES (6);
    INSERT INTO t VALUES (7);
    INSERT INTO t VALUES (8);
     
    UPDATE t
    SET ID = 9
    FROM (SELECT TOP 5 ID 
          FROM t 
          ORDER BY ID) AS t2
    WHERE t.ID = t2.ID;
    ++

  3. #3
    Membre extrêmement actif
    Avatar de zooffy
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Août 2004
    Messages
    3 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Chef de projet MOA
    Secteur : Bâtiment

    Informations forums :
    Inscription : Août 2004
    Messages : 3 895
    Points : 1 434
    Points
    1 434
    Par défaut
    Merci beaucoup, c'est exactement ce que je voulais.

    Certes, j'aurais du poster aussi une structure de table, mais ma question est trés empirique. L'idée c'est de faire une selection de donnée selon un ordre étalbie et une clause Where dans une table et ne mettre à jour que les x première lignes.

    Pour l'exemple concret qui m'ocucpe ce jour, mais cette va se reproduire dans mes sites :
    j'ai fais un module d'inscription à un évènement. Cet évènement à un nombre de participant maximum et une liste d'attente. Si un particpants se désinscrit je dois faire monter le premier de la liste d'atent dans la liste des inscrits. Cela correpond à une donnée (1 ou 2) dans un champ de la table. La table contient l'identifiant de l'évènement, l'identifiant du particpant, le statut (1 ou 2) et la date d'inscription. Du coup ça veux dire qu'il aller chercher le nombre maximum de particiapn, le mettre dans le TOP de la requête, rnger tout ça par date avec le Order BY et mettre à jour les statut des X premiers.

    Là, je galère un peu car j'en ai un de plus que prévu sur mes test, mais faut que je remette à plat les choses parce que test sur tes, ça polule pas mal. Et faire des tests de sites tout seul lorsqu'il faut simuler 20 ou 30 comptes, hi hi , je me marre.......

    Et j'ai pas les moyens de m'acheter LaodRunner

    Encore merci.
    Mon blog de création d'univers : Qualhiryann
    Mon site qui parle de moi www.ozouf.com
    Pour les joueurs de WOW je suis sur Ysondres et mon perso est Ablanore.

  4. #4
    Membre extrêmement actif
    Avatar de zooffy
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Août 2004
    Messages
    3 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Chef de projet MOA
    Secteur : Bâtiment

    Informations forums :
    Inscription : Août 2004
    Messages : 3 895
    Points : 1 434
    Points
    1 434
    Par défaut
    Je rencontre un petit soucis

    Lorsque je fais ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    UPDATE dbo.MEET_User_SpeedDating SET USD_Statut = 1 
    FROM (SELECT TOP 5 SD_Id FROM dbo.MEET_User_SpeedDating    
    WHERE SD_Id = 1 ORDER BY USD_Date_Inscription) AS t2    
    WHERE dbo.MEET_User_SpeedDating.SD_Id = t2.SD_Id
    Il me mets qu'il affecte 6 lignes et je ne cormepnds pas pourquoi.

    Ma table est faite comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    USE [siteglobal]
    GO
    /****** Objet*:  Table [dbo].[MEET_User_SpeedDating]    Date de génération du script*: 09/07/2009 10:33:31 ******/
    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
    CREATE TABLE [dbo].[MEET_User_SpeedDating](
    	[SD_Id] [int] NULL,
    	[UserId] [uniqueidentifier] NULL,
    	[USD_Statut] [int] NULL CONSTRAINT [DF_MEET_User_SpeedDating_USD_Statut]  DEFAULT ((0)),
    	[USD_Date_Inscription] [datetime] NULL CONSTRAINT [DF_MEET_User_SpeedDating_USD_Date_Inscription]  DEFAULT (getdate())
    ) ON [PRIMARY]
    Une idée ?
    Mon blog de création d'univers : Qualhiryann
    Mon site qui parle de moi www.ozouf.com
    Pour les joueurs de WOW je suis sur Ysondres et mon perso est Ablanore.

  5. #5
    Expert éminent sénior
    Avatar de mikedavem
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2005
    Messages
    5 450
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Ain (Rhône Alpes)

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

    Informations forums :
    Inscription : Août 2005
    Messages : 5 450
    Points : 12 891
    Points
    12 891
    Par défaut
    En regardant votre DDL de table je vois que la colonne [SD_Id] ne fait pas parti d'une quelconque clé primaire ou d'une contrainte d'unicité.

    Est ce que vous avez plusieurs fois la même valeur pour la colonne [SD_Id] dans votre table ? Si tel est le cas vous risquez de mettre à jour plusieurs lignes pour une même valeur de [SD_Id].

    ++

  6. #6
    Membre extrêmement actif
    Avatar de zooffy
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Août 2004
    Messages
    3 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Chef de projet MOA
    Secteur : Bâtiment

    Informations forums :
    Inscription : Août 2004
    Messages : 3 895
    Points : 1 434
    Points
    1 434
    Par défaut
    Oui, c'est tout à fait normal car cette colonne n'est pas une clé.
    La table est une table de liaison.

    La colonne SD_Id est l'identifiant de l'évènement qui est défini dans une autre table où là, il est une clé primaire.
    La colonne UserId reprend l'Identifiant de l'utilisateur inscrit à l'évènement concerné.

    Mais, en lisant ta réponse, j'ai eu une idée, que j'espère lumineuse.
    J'ai fais ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    UPDATE dbo.MEET_User_SpeedDating SET USD_Statut = 1 
    FROM (SELECT TOP 5 SD_Id, UserId FROM dbo.MEET_User_SpeedDating    
    WHERE SD_Id = 1 ORDER BY USD_Date_Inscription) AS t2    
    WHERE dbo.MEET_User_SpeedDating.SD_Id = t2.SD_Id AND dbo.MEET_User_SpeedDating.UserId = t2.UserId
    Du coup, ça passe mieux, mais est ce viable sur la durée ?

    Merci pour ton aide
    Mon blog de création d'univers : Qualhiryann
    Mon site qui parle de moi www.ozouf.com
    Pour les joueurs de WOW je suis sur Ysondres et mon perso est Ablanore.

  7. #7
    Rédacteur
    Avatar de WOLO Laurent
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Mars 2003
    Messages
    2 741
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Congo-Brazzaville

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

    Informations forums :
    Inscription : Mars 2003
    Messages : 2 741
    Points : 4 414
    Points
    4 414
    Par défaut
    Penser au bouton Résolu.

    Découvrez la FAQ de MS SQL Server.
    La chance accorde ses faveurs aux esprits avertis !

  8. #8
    Membre extrêmement actif
    Avatar de zooffy
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Août 2004
    Messages
    3 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Chef de projet MOA
    Secteur : Bâtiment

    Informations forums :
    Inscription : Août 2004
    Messages : 3 895
    Points : 1 434
    Points
    1 434
    Par défaut
    ooops, j'ai pas fait gaffe.

    Désolé.
    Mon blog de création d'univers : Qualhiryann
    Mon site qui parle de moi www.ozouf.com
    Pour les joueurs de WOW je suis sur Ysondres et mon perso est Ablanore.

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

Discussions similaires

  1. Erreur Recordset.update sur DAO VBA avec SQLServer
    Par rlapt dans le forum Général VBA
    Réponses: 1
    Dernier message: 27/02/2012, 11h06
  2. Update sur une table avec conditions
    Par tibss dans le forum Langage SQL
    Réponses: 8
    Dernier message: 08/07/2011, 17h13
  3. update sur plusieurs lignes avec table temporaire
    Par -=mateo=- dans le forum SQL
    Réponses: 3
    Dernier message: 23/12/2010, 14h40
  4. ORACLE v. 9 : Vue avec des clauses WHERE
    Par soffinette dans le forum Langage SQL
    Réponses: 4
    Dernier message: 01/02/2007, 14h11
  5. [Oracle] Update sur 1 colonne avec condition existence (SUBSTR)
    Par magic charly dans le forum Langage SQL
    Réponses: 6
    Dernier message: 20/04/2006, 13h57

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