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

Langage SQL Discussion :

Select => résultats avec doublons


Sujet :

Langage SQL

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2008
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 12
    Points : 5
    Points
    5
    Par défaut Select => résultats avec doublons
    Bonjour,

    Je fais la requete suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    SELECT     CAST(CODES.OC_CACHED_FULL_NAME AS VARCHAR) AS Expr1, MSP_CODE_FIELDS.PROJ_ID
    FROM         MSP_CODE_FIELDS INNER JOIN
                          MSP_RESOURCES ON MSP_CODE_FIELDS.CODE_REF_UID = MSP_RESOURCES.RES_UID INNER JOIN
                          MSP_PROJECTS ON MSP_RESOURCES.PROJ_ID = MSP_PROJECTS.PROJ_ID AND 
                          MSP_CODE_FIELDS.PROJ_ID = MSP_PROJECTS.PROJ_ID INNER JOIN
                          MSP_OUTLINE_CODES CODES ON MSP_CODE_FIELDS.CODE_UID = CODES.CODE_UID
    WHERE     (MSP_CODE_FIELDS.CODE_FIELD_ID LIKE '205521540') AND (MSP_RESOURCES.RES_NAME = 'KHOURY JOSEPH') AND 
                          (MSP_PROJECTS.PROJ_TYPE = 3)
    Le résultat donne :

    Expr1 PROJ_ID
    ATF.COAF.TEAM 1
    ATF.COAF.TEAM 1

    Or Proj_ID est un champs unique, donc pas de doublons possible.
    C'est donc ma requete qui est mauvaise, mais je ne vois pas où ??
    Merci de votre aide

  2. #2
    Expert éminent sénior
    Avatar de fsmrel
    Homme Profil pro
    Spécialiste en bases de données
    Inscrit en
    Septembre 2006
    Messages
    8 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Spécialiste en bases de données
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2006
    Messages : 8 073
    Points : 31 273
    Points
    31 273
    Billets dans le blog
    16
    Par défaut Sacs de redondances
    Si pour une valeur de MSP_CODE_FIELDS.PROJ_ID vous avez m valeurs de MSP_PROJECTS.PROJ_ID, si pour une valeur de MSP_PROJECTS.PROJ_ID vous avez n valeurs de MSP_RESOURCES.PROJ_ID, si pour une valeur de MSP_CODE_FIELDS.PROJ_ID vous avez p valeurs de MSP_CODE_FIELDS.CODE_UID, et si pour une valeur de MSP_CODE_FIELDS.CODE_UID vous avez q valeurs de CODES.CODE_UID alors au résultat vous aurez m x n x p x q fois la même valeur pour MSP_CODE_FIELDS.PROJ_ID.

    La projection selon SQL (le SELECT final si vous préférez) n’est pas un opérateur relationnel car il n’élimine pas les doublons et vous transmet donc un sac de redondances. Ça n'est pas très sérieux, mais SQL est ainsi fait : quand vous utilisez l'opérateur UNION, il élimine les redondances, pas avec la PROJECTION. C'est une des raisons pour lesquelles on dit que SQL n'est pas orthogonal.

    Pour éliminer les lignes en double, vous pouvez ajouter DISTINCT à la suite de SELECT.
    (a) Faites simple, mais pas plus simple ! (A. Einstein)
    (b) Certes, E=mc², mais si on discute un peu, on peut l’avoir pour beaucoup moins cher... (G. Lacroix, « Les Euphorismes de Grégoire »)
    => La relativité n'existerait donc que relativement aux relativistes (Jean Eisenstaedt, « Einstein et la relativité générale »)

    __________________________________
    Bases de données relationnelles et normalisation : de la première à la sixième forme normale
    Modéliser les données avec MySQL Workbench
    Je ne réponds pas aux questions techniques par MP. Les forums sont là pour ça.

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2008
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 12
    Points : 5
    Points
    5
    Par défaut Distinct fonctionne t'il dans un update avec sous requete ?
    Effectivement, j'avais testé le DISCTINCT qui fonctionne bien pour le SELECT.

    Par contre j'utilise ce SELECT dans une sous requete d'UPDATE. Et j'ai beau ajouter un DISCTINCT, il me répond invariablement la chose suivante :

    Subquery returned more than 1 value. This is not permitted when the subquery follows =, !=, <, <= , >, >= or when the subquery is used as an expression.
    The statement has been terminated.


    A titre informatif (et pour aider à l'analyse eventuellement) voici ma requete complete :

    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
    UPDATE MSP_OUTLINE_CODES
    SET OC_CACHED_FULL_NAME = (
    	SELECT     DISTINCT CAST(CODES.OC_CACHED_FULL_NAME AS VARCHAR)
    	FROM         dbo.MSP_RESOURCES INNER JOIN
    	                      dbo.MSP_PROJECTS ON dbo.MSP_RESOURCES.PROJ_ID = dbo.MSP_PROJECTS.PROJ_ID INNER JOIN
    	                      dbo.MSP_CODE_FIELDS ON dbo.MSP_PROJECTS.PROJ_ID = dbo.MSP_CODE_FIELDS.PROJ_ID AND 
    	                      dbo.MSP_RESOURCES.RES_UID = dbo.MSP_CODE_FIELDS.CODE_REF_UID INNER JOIN
    	                      dbo.MSP_OUTLINE_CODES CODES ON dbo.MSP_CODE_FIELDS.CODE_UID = dbo.MSP_OUTLINE_CODES.CODE_UID
    	WHERE     (dbo.MSP_CODE_FIELDS.CODE_FIELD_ID LIKE '205521540') AND (dbo.MSP_RESOURCES.RES_NAME = 'KHOURY JOSEPH') AND 
    	                      (dbo.MSP_PROJECTS.PROJ_TYPE = 3)
    	)
    WHERE 	CAST(OC_CACHED_FULL_NAME AS VARCHAR)= (
    	SELECT   DISTINCT CAST(CODES2.OC_CACHED_FULL_NAME AS VARCHAR)
    	FROM         dbo.MSP_WEB_RESOURCES INNER JOIN
    	                      dbo.MSP_RESOURCES ON dbo.MSP_WEB_RESOURCES.RES_NAME = dbo.MSP_RESOURCES.RES_NAME INNER JOIN
    	                      dbo.MSP_PROJECTS ON dbo.MSP_RESOURCES.PROJ_ID = dbo.MSP_PROJECTS.PROJ_ID INNER JOIN
    	                      dbo.MSP_ASSIGNMENTS INNER JOIN
    	                      dbo.MSP_TASKS ON dbo.MSP_ASSIGNMENTS.TASK_UID = dbo.MSP_TASKS.TASK_UID ON 
    	                      dbo.MSP_RESOURCES.RES_UID = dbo.MSP_ASSIGNMENTS.RES_UID AND dbo.MSP_RESOURCES.PROJ_ID = dbo.MSP_ASSIGNMENTS.PROJ_ID AND
    	                       dbo.MSP_PROJECTS.PROJ_ID = dbo.MSP_TASKS.PROJ_ID INNER JOIN
    	                      dbo.MSP_CODE_FIELDS ON dbo.MSP_PROJECTS.PROJ_ID = dbo.MSP_CODE_FIELDS.PROJ_ID AND 
    	                      dbo.MSP_RESOURCES.RES_UID = dbo.MSP_CODE_FIELDS.CODE_REF_UID INNER JOIN
    	                      dbo.MSP_OUTLINE_CODES CODES2 ON dbo.MSP_CODE_FIELDS.CODE_UID = dbo.MSP_OUTLINE_CODES.CODE_UID
    	WHERE     (dbo.MSP_CODE_FIELDS.CODE_FIELD_ID LIKE '205521540') AND (dbo.MSP_RESOURCES.RES_NAME LIKE 'KHOURY JOSEPH')
    	 	)

Discussions similaires

  1. Voir le début du résultat avec SELECT
    Par nymus7 dans le forum Débuter
    Réponses: 2
    Dernier message: 22/11/2010, 17h04
  2. Réponses: 2
    Dernier message: 20/04/2007, 13h48
  3. ADO + Access 2000 + index avec doublon
    Par jnc dans le forum Bases de données
    Réponses: 7
    Dernier message: 25/10/2005, 16h49
  4. Générer un fichier résultat avec sépateur ;
    Par soulryo dans le forum MS SQL Server
    Réponses: 8
    Dernier message: 30/08/2005, 09h57
  5. Générer un fichier résultat avec sépateur ;
    Par soulryo dans le forum Langage SQL
    Réponses: 3
    Dernier message: 29/08/2005, 12h29

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