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 :

Valeur NULL éliminée par un agrégat ou par une autre opération SET


Sujet :

Développement SQL Server

  1. #1
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2011
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2011
    Messages : 3
    Points : 4
    Points
    4
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    Avertissement : la valeur NULL est éliminée par un agrégat ou par une autre opération SET.

  2. #2
    Modérateur

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2005
    Messages
    5 826
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Haute Garonne (Midi Pyrénées)

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

    Informations forums :
    Inscription : Janvier 2005
    Messages : 5 826
    Points : 12 371
    Points
    12 371
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    HAVING  MAX([Date réalisée]) IS NOT NULL
    Est inutile, et la requête peut s'écrire :

    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
    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 : 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
    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
    @++

  3. #3
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2011
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2011
    Messages : 3
    Points : 4
    Points
    4
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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.

Discussions similaires

  1. Réponses: 2
    Dernier message: 19/11/2012, 19h44
  2. Réponses: 0
    Dernier message: 19/11/2012, 11h57
  3. Réponses: 5
    Dernier message: 06/10/2011, 12h56
  4. Réponses: 0
    Dernier message: 28/11/2008, 13h46
  5. Réponses: 25
    Dernier message: 30/05/2007, 13h03

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