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 15/06/2011, 09h20   #1
Invité de passage
 
Homme
Étudiant
Inscription : juin 2011
Messages : 4
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : juin 2011
Messages : 4
Points : 0
Points : 0
Par défaut Valeur NULL éliminée par un agrégat ou par une autre opération SET

Je dois développer un code SQL sous SQL Server 2005 qui permettra de remplir une table depuis certaines informations d'une autre table.
Mon code
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
UPDATE    [Revue Ident S2]
SET              Utilisateur = [Revue Ident S2].Utilisateur, [Ident_FT MANHAB] = [Temp Habil].[Ident_FT ManHab], [Nom ManHab] = [Revue Ident S2].[Nom ManHab], 
                      [Prenom ManHab] = [Revue Ident S2].[Prenom ManHab], [Email ManHab] = [Revue Ident S2].[Email ManHab], Service = [Temp Habil].[Entité Bénéficiaire], 
                      [Date MAJ] = [Temp Habil].Date
FROM         (SELECT     [Ident_FT Bénéficiaire], [Entité Bénéficiaire], MAX([Date réalisée]) AS Date, [Ident_FT ManHab], [Nom ManHab], [Prenom ManHab], 
                                              [Email ManHab], Utilisateur
                       FROM          [Habilitation stagiaires]
                       GROUP BY [Ident_FT Bénéficiaire], [Entité Bénéficiaire], [Ident_FT ManHab], [Nom ManHab], [Prenom ManHab], [Email ManHab], Utilisateur
                       HAVING      ([Entité Bénéficiaire] IS NOT NULL) AND ([Ident_FT ManHab] IS NOT NULL) AND ([Nom ManHab] IS NOT NULL) AND 
                                              ([Prenom ManHab] IS NOT NULL) AND ([Email ManHab] IS NOT NULL) AND ([Ident_FT Bénéficiaire] IS NOT NULL) AND (MAX([Date réalisée]) 
                                              IS NOT NULL) AND (Utilisateur IS NOT NULL)) AS [Temp Habil] LEFT OUTER JOIN
                      [Revue Ident S2] ON [Temp Habil].[Ident_FT Bénéficiaire] = [Revue Ident S2].ident
WHERE     ([Revue Ident S2].ident = [Temp Habil].[Ident_FT Bénéficiaire]) AND (NOT ([Revue Ident S2].[Ident_FT MANHAB] LIKE [Temp Habil].[Ident_FT ManHab])) AND 
                      ([Revue Ident S2].[Date MAJ] IS NOT NULL)


Lorsque je l'exécute je ne comprends pas pourquoi j'ai cet avertissement alors que je ne sélectionne pas les valeurs NULL
Code :
Avertissement : la valeur NULL est éliminée par un agrégat ou par une autre opération SET.
nicolas81 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/06/2011, 10h13   #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,

C'est en fait normal puisque dans le cas contraire, comme NULL n'est pas une valeur, alors le MAX() serait NULL.
J'explique ici pourquoi.

Dès lors :

Code :
HAVING  MAX([Date réalisée]) IS NOT NULL
Est inutile, et la requête peut s'écrire :

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
UPDATE		dbo.[Revue Ident S2]
SET		Utilisateur = RIS2.Utilisateur
		, [Ident_FT MANHAB] = TH.[Ident_FT ManHab]
		, [Nom ManHab] = RIS2.[Nom ManHab]
		, [Prenom ManHab] = RIS2.[Prenom ManHab]
		, [Email ManHab] = RIS2.[Email ManHab]
		, Service = TH.[Entité Bénéficiaire]
		, [Date MAJ] = TH.Date
FROM		(
			SELECT	[Ident_FT Bénéficiaire]
				, [Entité Bénéficiaire]
				, MAX([Date réalisée]) AS Date
				, [Ident_FT ManHab]
				, [Nom ManHab]
				, [Prenom ManHab]
				, [Email ManHab]
				, Utilisateur
			FROM	dbo.[Habilitation stagiaires]
			WHERE	[Entité Bénéficiaire] IS NOT NULL
			AND	[Ident_FT ManHab] IS NOT NULL
			AND	[Nom ManHab] IS NOT NULL
			AND	[Prenom ManHab] IS NOT NULL
			AND	[Email ManHab] IS NOT NULL
			AND	[Ident_FT Bénéficiaire] IS NOT NULL
			AND	Utilisateur IS NOT NULL
			GROUP	BY [Ident_FT Bénéficiaire]
				, [Entité Bénéficiaire]
				, [Ident_FT ManHab]
				, [Nom ManHab]
				, [Prenom ManHab]
				, [Email ManHab]
				, Utilisateur
		) AS TH
LEFT JOIN	dbo.[Revue Ident S2] AS RIS2
			ON TH.[Ident_FT Bénéficiaire] = RIS2.ident
WHERE		RIS2.ident = TH.[Ident_FT Bénéficiaire]
AND		RIS2.[Ident_FT MANHAB] <> TH.[Ident_FT ManHab]
AND		RIS2.[Date MAJ] IS NOT NULL
Petites remarques :

- La clause HAVING permet de filtrer les groupes sur la valeur de l'aggrégat. Donc tous les AND que vous avez mis après cette clause ne sont pas à leur place
- Les noms des colonnes et des tables ne respectent pas les standards de nommage, à savoir pas d'espaces et pas d'accents (entre autres)
- Vous avez utilisé NOT LIKE sans joker (%), ce qui revient à "différent de"
- Vous n'avez pas qualifié les tables par le nom du schéma auquel elles appartiennent, ce qui oblige SQL Server à le chercher à votre place.
Par défaut c'est dbo.

Dès SQL Server 2005, vous pouvez aussi écrire votre requête comme suit :

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
;WITH
	TH AS
	(
		SELECT	[Ident_FT Bénéficiaire]
			, [Entité Bénéficiaire]
			, MAX([Date réalisée]) AS Date
			, [Ident_FT ManHab]
			, [Nom ManHab]
			, [Prenom ManHab]
			, [Email ManHab]
			, Utilisateur
		FROM	dbo.[Habilitation stagiaires]
		WHERE	[Entité Bénéficiaire] IS NOT NULL
		AND	[Ident_FT ManHab] IS NOT NULL
		AND	[Nom ManHab] IS NOT NULL
		AND	[Prenom ManHab] IS NOT NULL
		AND	[Email ManHab] IS NOT NULL
		AND	[Ident_FT Bénéficiaire] IS NOT NULL
		AND	Utilisateur IS NOT NULL
		GROUP	BY [Ident_FT Bénéficiaire]
			, [Entité Bénéficiaire]
			, [Ident_FT ManHab]
			, [Nom ManHab]
			, [Prenom ManHab]
			, [Email ManHab]
			, Utilisateur
	)
UPDATE		dbo.[Revue Ident S2]
SET		Utilisateur = RIS2.Utilisateur
		, [Ident_FT MANHAB] = TH.[Ident_FT ManHab]
		, [Nom ManHab] = RIS2.[Nom ManHab]
		, [Prenom ManHab] = RIS2.[Prenom ManHab]
		, [Email ManHab] = RIS2.[Email ManHab]
		, Service = TH.[Entité Bénéficiaire]
		, [Date MAJ] = TH.Date
FROM		TH
LEFT JOIN	dbo.[Revue Ident S2] AS RIS2
			ON TH.[Ident_FT Bénéficiaire] = RIS2.ident
WHERE		RIS2.ident = TH.[Ident_FT Bénéficiaire]
AND		RIS2.[Ident_FT MANHAB] <> TH.[Ident_FT ManHab]
AND		RIS2.[Date MAJ] IS NOT NULL
@++
__________________
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 20
Vieux 15/06/2011, 11h13   #3
Invité de passage
 
Homme
Étudiant
Inscription : juin 2011
Messages : 4
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : juin 2011
Messages : 4
Points : 0
Points : 0
Merci de ta réponse elsuket ainsi que pour tes remarques.
Seulement lorsque j'exécute l'une ou l'autre de tes requêtes j'ai toujours le même avertissement:
Code :
Avertissement*: la valeur NULL est éliminée par un agrégat ou par une autre opération SET.
Si tu as une solution car je ne trouve pas le problème.
nicolas81 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 05h27.


 
 
 
 
Partenaires

Hébergement Web