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 19/08/2011, 14h54   #1
Invité de passage
 
Homme
Chef de projet .Net
Inscription : mars 2011
Messages : 52
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Chef de projet .Net
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : mars 2011
Messages : 52
Points : 4
Points : 4
Par défaut Problème requêtes imbriquées et allias

Bonjour à tous,

Je suis en train de réaliser une requête qui est censée me sortir un tableau me permettant un suivi des données de la base de données.

J'ai besoin de récupérer une valeur à un instant t de l'exécution de la requête et j'avais pensé avoir recours à l'utilisation d'un allias mais ça ne fonctionne pas. Je vous met la requête en copie afin de vous donner une idée de ce que je veux faire:

(l'allias que je souhaite réutiliser est l'allias a1)

Code :
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
26
27
 
SELECT
[...] ,
(SELECT Username
	FROM viza.dbo.UserJeu AS a1
	WHERE UserId = (SELECT UserId_FK
			FROM viza.dbo.VisitUserJeu
			WHERE VisitRoleId_FK = (SELECT VisitRoleId
					FROM viza.dbo.VisitRoleJeu
					WHERE Name = 'Auditeur')
			AND VisitId_FK = viza.dbo.SourceJeu.SourceId))
	AS "Auditeur n°1",
(SELECT Username
	FROM viza.dbo.UserJeu
	WHERE UserId <> (SELECT UserId
			 FROM viza.dbo.UserJeu
			 WHERE Username = a1)
	AND UserId = (SELECT UserId_FK
			  FROM viza.dbo.VisitUserJeu
			  WHERE VisitRoleId_FK = (SELECT VisitRoleId
					  FROM viza.dbo.VisitRoleJeu
					  WHERE Name = 'Auditeur')
			  AND VisitId_FK = viza.dbo.SourceJeu.SourceId))
	AS "Auditeur n°2",
[...]
FROM viza.dbo.SourceJeu
WHERE [...]
Si quelqu'un à une idée...
Merci d'avance.

M. PILARD
mpilard est déconnecté   Envoyer un message privé Réponse avec citation 01
Vieux 19/08/2011, 15h09   #2
Expert Confirmé
 
Avatar de 7gyY9w1ZY6ySRgPeaefZ
 
Homme
dba
Inscription : juillet 2007
Messages : 2 520
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Canada

Informations professionnelles :
Activité : dba

Informations forums :
Inscription : juillet 2007
Messages : 2 520
Points : 3 967
Points : 3 967
Des idées j'en ai beaucoup...
Mais comment t'aider avec un bout de requête tronquée, sans connaitre ce que tu cherches à faire et sans aucune information sur le modèle, ni structure de tables...
Et "ça ne marche pas" est une information particulièrement vague...
Si tu veux des réponses, il va falloir être un poil plus précis.
__________________
les règles du forum - mode d'emploi du forum
Aucun navigateur ne propose d'extension boule-de-cristal : postez votre code et vos messages d'erreurs.
(Rappel : "ça ne marche pas" n'est pas un message d'erreur)
JE NE RÉPONDS PAS aux questions techniques par message privé.
Écrire en français sur un forum est une marque minimale de respect.
7gyY9w1ZY6ySRgPeaefZ est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/08/2011, 15h52   #3
Invité de passage
 
Homme
Chef de projet .Net
Inscription : mars 2011
Messages : 52
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Chef de projet .Net
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : mars 2011
Messages : 52
Points : 4
Points : 4
Le reste de la requête n'est pas nécessaire et fonctionne corectement.

Je souhaite en fait récupérer le résultat affiché dans la colonne nommée "Auditeur n°1" afin d'afficher dans la colonne "Auditeur n°2" une valeur qui est bien différente...

J'ai essayé de mettre le résultat en a1 pour faire ma comparaison sur a1 mais je me fais jetter avec le message d'erreur suivant:

Citation:
Nom de colonne non valide*: 'a1'.
mpilard est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/08/2011, 16h08   #4
Membre Expert
 
Avatar de Yanika_bzh
 
Homme Yannick
Ingénieur Etudes & Developpements
Inscription : février 2006
Messages : 1 125
Détails du profil
Informations personnelles :
Nom : Homme Yannick
Localisation : France, Deux Sèvres (Poitou Charente)

Informations professionnelles :
Activité : Ingénieur Etudes & Developpements
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : février 2006
Messages : 1 125
Points : 1 670
Points : 1 670
a1 etant un alias dans une sous requete, la requete au dessus ne peut pas l'atteindre.

Je pense que votre requete est a revoir, mais ne sachant pas ce que vous voulez exactement et ne connaissant pas le modele de données, il va etre tres difficile de vous répondre.

Bon courage
__________________
Dans la connaissance du monde, ceux qui ne savent rien en savent toujours autant que ceux qui n'en savent pas plus qu'eux. (Pierre Dac)
Yanika_bzh est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/08/2011, 10h49   #5
Invité de passage
 
Homme
Chef de projet .Net
Inscription : mars 2011
Messages : 52
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Chef de projet .Net
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : mars 2011
Messages : 52
Points : 4
Points : 4
Le requête complète est la suivante:

Code :
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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
 
SELECT
	Date,
	(SELECT Name
		FROM viza.dbo.SectorJeu
		WHERE SectorId = viza.dbo.SourceJeu.SectorId_FK)
		AS "Secteur",
	(SELECT Username
		FROM viza_nestle.dbo.UserJeu AS a1
		WHERE UserId = (SELECT UserId_FK
				FROM viza.dbo.VisitUserJeu
				WHERE VisitRoleId_FK = (SELECT VisitRoleId
							FROM viza.dbo.VisitRoleJeu
							WHERE Name = 'Auditeur')
				AND VisitId_FK = viza.dbo.SourceJeu.SourceId))
		AS "Auditeur n°1",
	(SELECT Username
		FROM viza.dbo.UserJeu
		WHERE UserId <> (SELECT UserId
				 FROM viza.dbo.UserJeu
				 WHERE Username = a1)
		AND UserId = (SELECT UserId_FK
				  FROM viza.dbo.VisitUserJeu
				  WHERE VisitRoleId_FK = (SELECT VisitRoleId
							  FROM viza.dbo.VisitRoleJeu
							  WHERE Name = 'Auditeur')
				  AND VisitId_FK = viza.dbo.SourceJeu.SourceId))
		AS "Auditeur n°2",
	(SELECT Description
		FROM viza.dbo.ActionJeu
		WHERE SourceId_FK = viza.dbo.SourceJeu.SourceId)
		AS "Action prise",
	(SELECT Name
		FROM viza.dbo.CategoryJeu
		WHERE CategoryId = (SELECT CategoryId_FK
				   FROM viza.dbo.ActionJeu
				   WHERE SourceId_FK = viza.dbo.SourceJeu.SourceId))
		AS "Type d'action",
	(SELECT Delay
		FROM viza.dbo.ActionJeu
		WHERE SourceId_FK = viza.dbo.SOurceJeu.SourceId)
		AS "Délai d'action",
	(SELECT Username
		FROM viza.dbo.UserJeu
		WHERE UserId = (SELECT UserId_FK
				FROM viza.dbo.ActionJeu
				WHERE SourceId_FK = viza.dbo.SourceJeu.SourceId))
		AS "Responsable d'action",
	FileURL AS "Fichier archivé"
FROM viza.dbo.SourceJeu
WHERE TypeId_FK = (SELECT SourceTypeId
		FROM viza.dbo.SourceTypeJeu
		WHERE Name = 'Audit de secteur')
Pour contourner mon problème, il serait parfait de pouvoir sotcker la valeur de la sous requete
Code :
1
2
3
4
5
6
7
8
9
10
 
(SELECT Username
	FROM viza_nestle.dbo.UserJeu AS a1
	WHERE UserId = (SELECT UserId_FK
			FROM viza.dbo.VisitUserJeu
			WHERE VisitRoleId_FK = (SELECT VisitRoleId
						FROM viza.dbo.VisitRoleJeu
						WHERE Name = 'Auditeur')
			AND VisitId_FK = viza.dbo.SourceJeu.SourceId))
	AS "Auditeur n°1",
dans une variable afin de la réutiliser dans la sous requete
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
 
(SELECT Username
	FROM viza.dbo.UserJeu
	WHERE UserId <> (SELECT UserId
			 FROM viza.dbo.UserJeu
			 WHERE Username = a1)
	AND UserId = (SELECT UserId_FK
			  FROM viza.dbo.VisitUserJeu
			  WHERE VisitRoleId_FK = (SELECT VisitRoleId
					  FROM viza.dbo.VisitRoleJeu
					  WHERE Name = 'Auditeur')
			  AND VisitId_FK = viza.dbo.SourceJeu.SourceId))
	AS "Auditeur n°2",
Comment ceci peut se réaliser?

En pièce jointe du message, un extrait du MCD afin de visualiser au mieux la base de données.

Cordialement,
Images attachées
Type de fichier : png database - Copie.png (191,0 Ko, 5 affichages)
mpilard est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/08/2011, 16h24   #6
Membre Expert
 
Avatar de Yanika_bzh
 
Homme Yannick
Ingénieur Etudes & Developpements
Inscription : février 2006
Messages : 1 125
Détails du profil
Informations personnelles :
Nom : Homme Yannick
Localisation : France, Deux Sèvres (Poitou Charente)

Informations professionnelles :
Activité : Ingénieur Etudes & Developpements
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : février 2006
Messages : 1 125
Points : 1 670
Points : 1 670
Que de sous requetes !!!
Vous ne pouvez pas employer des jointures dans vos requetes, cela les rendrait beaucoup plus lisible.

toutes vos sous requetes vous rammenent des valeurs ?
__________________
Dans la connaissance du monde, ceux qui ne savent rien en savent toujours autant que ceux qui n'en savent pas plus qu'eux. (Pierre Dac)
Yanika_bzh est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/08/2011, 09h43   #7
Invité de passage
 
Homme
Chef de projet .Net
Inscription : mars 2011
Messages : 52
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Chef de projet .Net
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : mars 2011
Messages : 52
Points : 4
Points : 4
Oui, toutes les requêtes me renvoient des valeurs. Je vais toutefois essayer de modifier la requête en réalisant des jointures.

Aucune idée de comment faire pour mémoriser la valeur retournée lors d'une sous requête afin de pouvoir l'utiliser lors de la sous-reqûete suivante?
mpilard est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/08/2011, 10h05   #8
Membre Expert
 
Avatar de Yanika_bzh
 
Homme Yannick
Ingénieur Etudes & Developpements
Inscription : février 2006
Messages : 1 125
Détails du profil
Informations personnelles :
Nom : Homme Yannick
Localisation : France, Deux Sèvres (Poitou Charente)

Informations professionnelles :
Activité : Ingénieur Etudes & Developpements
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : février 2006
Messages : 1 125
Points : 1 670
Points : 1 670
En utilisant une auto jointure

Code :
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
26
27
28
29
30
31
32
33
34
35
SELECT  
	Date,
	SectorJeu.Name AS 'Secteur',
	UserJeuA.Username AS 'Auditeur n°1',
	UserJeuB.Username AS 'Auditeur n°2',
	ActionJeu.Description AS 'Action prise',
	CategoryJeu.Name AS 'Type d''action',
	ActionJeu.Delay AS 'Délai d''action',
	UserJeu.UserName AS 'Responsable d''action',
	FileURL AS 'Fichier archivé'
FROM
	viza.dbo.SourceJeu SourceJeu
INNER JOIN
	viza.dbo.VisitUserJeu VisitUserJeuA ON (SourceJeu.SourceId = VisiteurUserJeuA.VisitId_FK)
INNER JOIN
	viza.dbo.VisitUserJeu VisitUserJeuB ON (SourceJeu.SourceId = VisiteurUserJeuB.VisitId_FK)
INNER JOIN
	viza.dbo.VisitRoleJeu VisitRoleJeu ON (VisitRoleJei.VisiteRoleId = VisitUserJeuA.VisitRoleId_FK AND VisitRoleJei.VisiteRoleId = VisitUserJeuB.VisitRoleId_FK)
INNER JOIN
	viza.dbo.UserJeu UserJeuA ON (UserJeuA.UserId = VisitUserJeuA.UserId_FK)
INNER JOIN
	viza.dbo.UserJeu UserJeuB ON (UserJeuB.UserId = VisitUserJeuB.UserId_FK AND UserJeuB.UserId<>UserJeuA.UserId)
INNER JOIN 
	viza.dbo.ActionJeu ActionJeu ON (SourceJeu.SourceId = ActionJeu.SourceId_FK)
INNER JOIN
	viza.dbo.CategoryJeu CategoryJeu ON (ActionJeu.CategoryId_FK = CategoryJeu.CategotyId)
INNER JOIN
	viza.dbo.UserJeu UserJeu ON (UserJeu.UserId = ActionJeu.UserId_FK)
INNER JOIN 
	viza.dbo.SectorJeu SectorJeu ON (SectorJeu.SectorId = SourceJeu.SectorId_FK)
INNER JOIN
	viza.dbo.SourceTypeJeu SourceTypeJeu ON (SourceTypeJeu.SourceTypeId = SourceJeu.TypeId_FK)
WHERE 
	SourceTypeJeu.Name = 'Audit de secteur'	AND
	VisitRoleJeu='Auditeur'
Le mieux serait de la réécrire par étape, afin de bien comprendre ce que vous vous voulez faire.
Attention a vos noms de colonne (date par exemple) qui peuvent etre des mots reservés du langage.
__________________
Dans la connaissance du monde, ceux qui ne savent rien en savent toujours autant que ceux qui n'en savent pas plus qu'eux. (Pierre Dac)
Yanika_bzh 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 11h25.


 
 
 
 
Partenaires

Hébergement Web