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 26/05/2011, 09h11   #1
Membre du Club
 
Inscription : juin 2009
Messages : 101
Détails du profil
Informations forums :
Inscription : juin 2009
Messages : 101
Points : 40
Points : 40
Par défaut Probleme de parenthese dans une requete

Bonjour je travail sur SQL Server 2008

Ma requete rencontre un probleme selon Microsoft sql server management edition. Une erreur de syntaxe vers le mot clé group sur ma derniere ligne


Code :
1
2
3
4
5
6
7
8
9
10
 
SELECT table1.idpersonne FROM table1  
INNER JOIN (SELECT ENFANTS_A.enfantid FROM (SELECT idpersele AS enfantid FROM table2
INNER JOIN (SELECT annee  FROM table3  WHERE fushianet_peri = 1 AND annee = 2010) AAAA  
ON table2.annee = AAAA.annee WHERE idpersele > 0 GROUP BY idpersele  
UNION ALL
 SELECT enfantid  FROM table4 
INNER JOIN (SELECT annee  FROM table3 
WHERE  annee =2010) AAAA  ON tinscalsh.annee = AAAA.annee WHERE enfantid > 0
 GROUP BY enfantid ) ENFANTS_A GROUP BY ENFANTS_A.enfantid) ENFANTS GROUP BY table1.idpersonne
Je pense que c'est une erreur de parenthese mal placé ou manquante mais je n'arrive pas a voir ou est l'erreur

Merci d'avance
mattmax est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/05/2011, 09h17   #2
Modérateur

 
Avatar de elsuket
 
Homme Nicolas Souquet
Administrateur de base de données
Inscription : janvier 2005
Messages : 4 669
Détails du profil
Informations personnelles :
Nom : Homme Nicolas Souquet
Âge : 30
Localisation : Thaïlande

Informations professionnelles :
Activité : Administrateur de base de données
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : janvier 2005
Messages : 4 669
Points : 8 729
Points : 8 729
Bonjour,

Indenter le code de votre requête vous aurait aidé à trouver la source de votre erreur :

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
SELECT		table1.idpersonne 
FROM		table1 
INNER JOIN	(
			SELECT	ENFANTS_A.enfantid 
			FROM	(
							SELECT		idpersele AS enfantid 
							FROM		table2
							INNER JOIN	(
										SELECT	annee  
										FROM	table3  
										WHERE	fushianet_peri = 1 
										AND	annee = 2010
									) AAAA  
										ON table2.annee = AAAA.annee 
							WHERE		idpersele > 0 
							GROUP BY	idpersele  
					UNION ALL
						SELECT		enfantid  
						FROM		table4 
						INNER JOIN	(
									SELECT	annee  
									FROM	table3 
									WHERE  annee = 2010
								) AAAA
									ON tinscalsh.annee = AAAA.annee 
						WHERE		enfantid > 0
						GROUP BY	enfantid 
				) ENFANTS_A 
			GROUP	BY ENFANTS_A.enfantid
		) ENFANTS
GROUP BY	table1.idpersonne
Vous n'avez pas de prédicat de jointure pour la jointure entre table1 et la sous-requête définissant l'ensemble ENFANTS
C'est probablement :

Code :
ON table1.idpersonne = ENFANTS.idpersonne
Un peu de (T-)SQL tout de même :

La requête qui spécifie le UNION ALL peut s'écrire ainsi, puisque vous n'utilisez pas de fonction d’agrégat (COUNT(), SUM(), MIN(), MAX(), AVG(), ...)

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
	SELECT		DISTINCT T2.idpersele AS enfantid
	FROM		dbo.table2 AS T2
	INNER JOIN	dbo.table3 AS T3
				ON T3.annee = T2.annee
	WHERE		T3.annee = 2010
	AND		T2.idpersele > 0
UNION ALL
	SELECT		DISTINCT T4.enfantid
	FROM		dbo.table4 AS T4
	INNER JOIN	dbo.table3 AS T3
				ON T3.annee = T4.annee
	WHERE		T3.annee = 2010
	AND		T4.enfantid > 0
UNION ALL vous permet de prendre les enfantid provenant de chacun des deux ensembles, même s'il en existe des doublons.

Ensuite vous écrivez :

Code :
1
2
3
4
5
SELECT	ENFANTS_A.enfantid 
FROM	(
		-- requête UNION ALL
	) ENFANTS_A 
GROUP	BY ENFANTS_A.enfantid
Et il n'y a toujours pas de fonction d’agrégat.
C'est donc bien que vous ne vouliez pas de doublons.
Dans ce cas il suffit d'enlever les DISTINCT (ou GROUP BY), et le ALL d'UNION.
Le tri est effectué par UNION.
Votre requête devient alors :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
SELECT		DISTINCT T1.idpersonne
FROM		dbo.table1 AS T1
INNER JOIN	(
				SELECT		T2.idpersele AS enfantid
				FROM		dbo.table2 AS T2
				INNER JOIN	dbo.table3 AS T3
							ON T3.annee = T2.annee
				WHERE		T3.annee = 2010
				AND		T2.idpersele > 0
			UNION 	
				SELECT		T4.enfantid
				FROM		dbo.table4 AS T4
				INNER JOIN	dbo.table3 AS T3
							ON T3.annee = T4.annee
				WHERE		T3.annee = 2010
				AND		T4.enfantid > 0
		) AS ENFANTS 
			ON T1.idpersonne = ENFANTS.idpersonne
N'oubliez jamais de qualifier le nom des tables que vous manipulez par le nom du schéma auquel elles appartiennent.
Comme vous n'en avez pas mis, c'est le schéma pas défaut, qui est dbo.

Vous pouvez aussi utiliser les alias de table pour alléger le texte de votre requête

@++
__________________
En bases de données relationnelles SQL, il n'y a ni tableaux, ni enregistrements, ni champs: il y a des tables, des lignes et des colonnes.
Blog | Profil| Consulter ou télécharger les fichiers d'aide de SQL Server, des versions 2000 à 2012
elsuket est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/05/2011, 09h34   #3
Membre du Club
 
Inscription : juin 2009
Messages : 101
Détails du profil
Informations forums :
Inscription : juin 2009
Messages : 101
Points : 40
Points : 40
J'ai trouvé merci beaucoup de votre aide
mattmax est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/05/2011, 10h06   #4
Modérateur

 
Avatar de elsuket
 
Homme Nicolas Souquet
Administrateur de base de données
Inscription : janvier 2005
Messages : 4 669
Détails du profil
Informations personnelles :
Nom : Homme Nicolas Souquet
Âge : 30
Localisation : Thaïlande

Informations professionnelles :
Activité : Administrateur de base de données
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : janvier 2005
Messages : 4 669
Points : 8 729
Points : 8 729
Ce n'était pas le prédicat de jointure manquant ?

@++
__________________
En bases de données relationnelles SQL, il n'y a ni tableaux, ni enregistrements, ni champs: il y a des tables, des lignes et des colonnes.
Blog | Profil| Consulter ou télécharger les fichiers d'aide de SQL Server, des versions 2000 à 2012
elsuket est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 16h37.


 
 
 
 
Partenaires

Hébergement Web