Précédent   Forum des professionnels en informatique > Bases de données > MS SQL-Server > Développement
Développement Forum d'entraide sur le Transact-SQL, le CLR, les procédures stockées, les triggers, les requêtes SQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 10/01/2011, 11h54   #1
Invité régulier
 
Inscription : octobre 2009
Messages : 26
Détails du profil
Informations forums :
Inscription : octobre 2009
Messages : 26
Points : 7
Points : 7
Par défaut Update droits - groupes

Bonjour,

Je ne sais pas comment écrire la requête suivante.

J'ai
- une table
id | groupe | id-droit
------------------------
1 g2 4
1 g4 3
2 g4 1
3 g2 4
...
- une liste d'identifiants (1, 2)
- une liste de nouveaux droits de groupes ((g2 3)(g4 3))

Je souhaiterai mettre à jour l'id-droit des entrées dont id se retrouve dans la liste d'identifiants si le id-droit du groupe est supérieur à celui définit dans la liste de droits de groupes.
Donc pour la ligne 1 de la table, l'id-droit devrait être remplacé par 3 (le droit de g2 = 3 < 4).
La ligne 2 et 3 sont inchangées (les droits étant inférieurs à celui défini dans la liste des droits).
La ligne 4 n'est pas modifiée car l'id n'est pas présents dans la liste d'identifiants.
J'espère avoir été clair.

Merci d'avance pour votre aide.
fabienazerty est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/01/2011, 12h18   #2
Membre Expert
 
Inscription : janvier 2010
Messages : 1 084
Détails du profil
Informations personnelles :
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : janvier 2010
Messages : 1 084
Points : 1 573
Points : 1 573
Bonjour,

Le problème est clair, par contre, comment se présentent vos "listes"

s'agit-il de chaines de chaines de caractères ???

Et si c'est le cas, d'ou proviennent les données, et dans quel contexte effectuez-vous la requete ? (est-ce une procédure stockées à laquelle vous spécifiez les listes, ou est-ce que vous "construisez" la requete directement depuis votre programme ?)
aieeeuuuuu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/01/2011, 12h56   #3
Invité régulier
 
Inscription : octobre 2009
Messages : 26
Détails du profil
Informations forums :
Inscription : octobre 2009
Messages : 26
Points : 7
Points : 7
Les listes ne sont pas des chaînes de caractères.
Je construit la requête directement depuis mon programme.
Je pourrais effectuer des boucles dans mon programme pour effectuer les updates, mais j'esperais le faire en une requête sql.
fabienazerty est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/01/2011, 13h55   #4
Membre Expert
 
Inscription : janvier 2010
Messages : 1 084
Détails du profil
Informations personnelles :
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : janvier 2010
Messages : 1 084
Points : 1 573
Points : 1 573
re,


Effectivement, tu peux faire cela en une seule requete

inspire toi de ça pour faire ta requete dynamiquement dans ton programme :
Code sql :
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
 
declare @t TABLE(id int, groupe char(2), iddroit int)
INSERT INTO @t VALUES (1 ,'g2', 4)
INSERT INTO @t VALUES (1, 'g4', 3)
INSERT INTO @t VALUES (2, 'g4', 1)
INSERT INTO @t VALUES (3, 'g2', 4)
 
 
SELECT * FROM @t
 
UPDATE @t 
SET iddroit = gr.iddroit
FROM (VALUES
	(1), 
	(2)
) AS idents(id)
CROSS JOIN (VALUES
	('g2', 3),
	('g4', 3)
) AS gr(groupe, iddroit)
WHERE idents.id = [@t].id
AND gr.groupe = [@t].groupe
AND gr.iddroit < [@t].iddroit
 
SELECT * FROM @t

il faut que tu soit en 2005 2008 au moins pour que cette syntaxe soit acceptée a cause des constructeurs de lignes valuées : VALUES(), (), (),...

Si tu es dans une version antérieure, tu devra les remplacer par une série de SELECT ... UNION ALL SELECT ...
Code sql :
1
2
3
4
5
6
7
8
 
SELECT 1
UNION ALL SELECT 2
UNION ALL ...
-- ET
SELECT 'g2' , 3
UNION ALL SELECT 'g4', 3
UNION ALL ...
aieeeuuuuu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/01/2011, 14h37   #5
Invité régulier
 
Inscription : octobre 2009
Messages : 26
Détails du profil
Informations forums :
Inscription : octobre 2009
Messages : 26
Points : 7
Points : 7
Par défaut merci

Merci beaucoup.

Je vais essayer ceci

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
DECLARE @Données TABLE 
(id INT,  gp INT,  rt INT) 
INSERT INTO @Données (id,gp,rt) VALUES (1, 2, 4),(1, 4, 3),(2,4,1),(3,2,4)
 
DECLARE @Droits TABLE 
(gp INT, rt INT) 
INSERT INTO @Droits (gp,rt) VALUES (2, 3),(4, 3)
 
UPDATE @Données 
SET rt = [@Droits].rt
FROM @Droits
WHERE [@Données].id IN (1,2)
AND [@Données].gp = [@Droits].gp
AND [@Données].rt > [@Droits].rt
 
SELECT * FROM @Données
fabienazerty est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 18h49.


 
 
 
 
Partenaires

Hébergement Web