2009-09-30 2 views
0

Utilisation de SQL Server 2000Lors de l'utilisation de Distinct obtenant toujours des valeurs en double?

Comment éviter les doublons?

Recherche

SELECT DISTINCT 
    Modification.dbo.Reference.Dates AS DailyDate, 
    tmp_Cardevent2.PERSONID, 
    tmp_Cardevent2.empname, 
    tmp_cardevent2.cardno, 
    tmp_Cardevent2.titlecode, 
    tmp_Cardevent2.titlename, 
    tmp_Cardevent2.departname, 
    CASE 
     WHEN tmp_Cardevent2.CardEventDate = Modification.dbo.Reference.Dates 
     THEN tmp_Cardevent2.CardEventDate 
     ELSE '-----' 
    END AS EMPDATE, 
    CASE 
     WHEN tmp_Cardevent2.CardEventDate = Modification.dbo.Reference.Dates 
     THEN tmp_Cardevent2.Intime 
     ELSE '-----' 
    END AS INTIME 
WHEN tmp_Cardevent2.CardEventDate = Modification.dbo.Reference.Dates 
      THEN tmp_Cardevent2.outtime 
      ELSE '-----' 
     END AS outtime 
    FROM tmp_Cardevent2 
    CROSS JOIN Modification.dbo.Reference 
    ORDER BY 
     PERSONID, DAILYDATE DESC 

Sortie:

DailyDates, Personid, empname, cardno, titlecode, titlename, departname, empdate, intime, outtime 

12/30/2008 A201 A Cherian 3201 018 Chief Air Traffic Service Assistant Air Traffic Services ----- ----- 

12/30/2008 A201 A Cherian 3201 018 Chief Air Traffic Service Assistant Air Traffic Services 20081230 07:51:31 15:54:38 

12/30/2008 A201 A Cherian 3201 018 Chief Air Traffic Service Assistant Air Traffic Services 20081230 07:51:31 15:54:38 

Quel est le problème dans ma requête, pourquoi je reçois des valeurs en double? Comment éviter les valeurs en double.

S'il vous plaît pouvez-vous toute aide pour résoudre mon problème.

+1

indice: voulez-vous vraiment un CROSS JOIN? –

+0

Oui, j'obtiens une date de la table, la colonne restante d'une autre table. – Gopal

+1

Etes-vous sûr de ne pas vouloir faire partie d'une jointure gauche ou intérieure? –

Répondre

1

Tout d'abord, votre jeu de résultats donné:

DailyDates Personid empname cardno titlecode titlename       departname   empdate intime outtime 
---------- -------- --------- ------ --------- ----------------------------------- -------------------- -------- -------- -------- 
12/30/2008 A201  A Cherian 3201 018  Chief Air Traffic Service Assistant Air Traffic Services -----  -----  
12/30/2008 A201  A Cherian 3201 018  Chief Air Traffic Service Assistant Air Traffic Services 20081230 07:51:31 15:54:38 
12/30/2008 A201  A Cherian 3201 018  Chief Air Traffic Service Assistant Air Traffic Services 20081230 07:51:31 15:54:38 

ne correspond pas à votre requête donnée, il n'y a pas colonne « outtime » dans la requête:

SELECT DISTINCT 
    Modification.dbo.Reference.Dates AS DailyDate 
     ,tmp_Cardevent2.PERSONID 
     ,tmp_Cardevent2.empname 
     ,tmp_cardevent2.cardno 
     ,tmp_Cardevent2.titlecode 
     ,tmp_Cardevent2.titlename 
     ,tmp_Cardevent2.departname 
     ,CASE 
      WHEN tmp_Cardevent2.CardEventDate = Modification.dbo.Reference.Dates THEN tmp_Cardevent2.CardEventDate 
      ELSE '-----' 
     END AS EMPDATE 
     ,CASE 
      WHEN tmp_Cardevent2.CardEventDate = Modification.dbo.Reference.Dates THEN tmp_Cardevent2.Intime 
      ELSE '-----' 
     END AS INTIME 
    FROM tmp_Cardevent2 
     CROSS JOIN Modification.dbo.Reference 
    ORDER BY PERSONID, DAILYDATE DESC 

Sans connaître les schémas de table et comment ils se rapportent les uns aux autres, ainsi que les types de données de la colonne de:

Modification.dbo.Reference.Dates 
tmp_Cardevent2.CardEventDate 
tmp_Cardevent2.Intime 

il est difficile de derstand quelle est la véritable cause des doublons. Cependant, sur la base des informations limitées de la question, il est fort probable que le formatage d'une des colonnes date et/ou heure cache une différence réelle de valeurs.

3

Ces dates sont-elles de type DateTime ou simplement Date? Si elles incluent un temps, ce sera la raison pour laquelle elles ne sont pas égales. L'heure est simplement coupée lorsque le résultat est formaté.

Essayez de ne sélectionner que la partie date de ces valeurs.

0

Vous pouvez essayer d'envelopper une autre sélection distincte autour de celle-ci en tant que sous-requête, par ex.

select distinct * from (SELECT DISTINCT 
    Modification.dbo 
    ...) q 

Lorsque q est requis et que les noms sont interrogés en tant que pseudo-table.

Vous ne savez pas vraiment pourquoi la première distincte ne fonctionne pas, peut-être que le CASE confond son optimiseur?

Questions connexes