2013-06-13 7 views
2

Je dois joindre plusieurs tables dans une base de données SQL Server afin d'utiliser les champs du Générateur de rapports. Cette requête SQL est exécutée en tant que procédure stockée. Le problème est qu'il renvoie plusieurs lignes que je considère comme des doublons.Supprimer les doublons basés sur une colonne

Voici ma requête (certaines parties de la structure ont été retirées):

ALTER PROCEDURE [dbo].[GetRollCallData] 
    @Ids  VARCHAR(255), 
    @LexiconId INT, 
    @UUID  UNIQUEIDENTIFIER, 
    @ReadOnly INT 
AS 


DECLARE @TableCode INT 
SET @TableCode = 58 


     EXEC InsertInSelectionCache @Ids, @UUID, @TableCode, 0 

      SELECT [File].*, FileType2Lexicon.Label as FileTypeLabel, [People].DefaultPhone, CFV.Value as DOA, CFV.CustomRecordsetId 
       FROM FileType2Lexicon, SelectionCache, [People], [File] 
       INNER JOIN [CustomRecordSet] 
       ON [CustomRecordset].RecordId = [File].Id 
       INNER JOIN (SELECT Value, CustomFieldId, CustomRecordsetId FROM [CustomFieldValue]) CFV 
       ON [CustomRecordset].Id = CFV.CustomRecordsetId 
       INNER JOIN (SELECT CustomFieldId, Label FROM [CustomField2Lexicon]) CF2L 
       ON CF2L.CustomFieldId = CFV.CustomFieldId 
       WHERE [File].Id = SelectionCache.RecordId 
       AND SelectionCache.UUID = @UUID 
       AND SelectionCache.TableCode = @TableCode -- this is the code for File table 
       AND  [File].Id <> 0 
       AND  [File].FileTypeId = FileType2Lexicon.FileTypeId 
       AND  FileType2Lexicon.LexiconId = @LexiconId 
       AND  [File].ClientIdString = [People].ClientIdString 
       AND  CFV.Value <> '' 
       AND  CF2L.Label = 'Date of Arrest' 

Cela finit par revenir:

Id ShortFileNameMatterName Summary    FileTypeLabelDefaultPhone DOA   CustomRecordsetId 
4691 Bob State v. Bob RETAINED:1/1/2013 Criminal (123) 242-8454 2013-01-16 6942 
4691 Bob State v. Bob RETAINED:1/1/2013 Criminal (123) 242-8454 2013-01-16 6948 

Comme on le voit, les lignes dupliquez à cause de la colonne recordsetId. Chaque rangée de table a aussi son propre UUID.

Des idées? J'ai travaillé dessus pendant des jours.

EDIT: Voici ma solution que j'ai trouvée.

WITH RankedCTE AS(
     SELECT ROW_NUMBER() OVER(PARTITION BY [File].Id ORDER BY CustomRecordsetId DESC) AS RowNumber, [File].*, FileType2Lexicon.Label as FileTypeLabel, [People].DefaultPhone, [People].InvertedName, CFV.Value as DOA 
      FROM FileType2Lexicon, SelectionCache, [People], [File] 
      INNER JOIN [CustomRecordSet] 
      ON [CustomRecordset].RecordId = [File].Id 
      INNER JOIN (SELECT Value, CustomFieldId, CustomRecordsetId FROM [CustomFieldValue]) CFV 
      ON [CustomRecordset].Id = CFV.CustomRecordsetId 
      INNER JOIN (SELECT CustomFieldId, Label FROM [CustomField2Lexicon]) CF2L 
      ON CF2L.CustomFieldId = CFV.CustomFieldId 
      WHERE [File].Id = SelectionCache.RecordId 
      AND SelectionCache.UUID = @UUID 
      AND SelectionCache.TableCode = @TableCode -- this is the code for File table 
      AND  [File].Id <> 0 
      AND  [File].FileTypeId = FileType2Lexicon.FileTypeId 
      AND  FileType2Lexicon.LexiconId = @LexiconId 
      AND  [File].ClientIdString = [People].ClientIdString 
      AND  CFV.Value <> '' 
      AND  (CF2L.Label = 'Date of Arrest') 
     SELECT * 
     FROM RankedCTE 
     WHERE RowNumber = 1 

Répondre

1

Avez-vous pensé à utiliser soit ...

SELECT DISTINCT [FILE].*, (etc) 

Ou même ...

GROUP BY [FILE].id 
+0

J'ai essayé de les intégrer dans les types de données appropriés, mais je n'ai jamais pu le faire fonctionner. En fait, j'ai trouvé une solution. Merci pour l'aide. – Abyssul

+0

Pour aider la communauté sur la pile s'il vous plaît poster votre réponse afin que les autres puissent en tirer des leçons;) –

+1

Je l'ai posté dans mon message original comme un edit. Merci. – Abyssul

0

Si le problème est RecordSetId, puis groupe par le reste des colonnes et utiliser une agrégation colonne pour celui-là. Ou, résoudre le problème en agrégeant l'ensemble d'enregistrements:

SELECT [File].*, FileType2Lexicon.Label as FileTypeLabel, [People].DefaultPhone, CFV.Value as DOA, CFV.CustomRecordsetId 
     FROM FileType2Lexicon, SelectionCache, [People], [File] 
     INNER JOIN (select RecordId, max(id) as id 
        from [CustomRecordSet] 
        group by recordId 
        ) CustomRecordSet 
     ON [CustomRecordset].RecordId = [File].Id 
     INNER JOIN (SELECT Value, CustomFieldId, CustomRecordsetId FROM [CustomFieldValue]) CFV 
     ON [CustomRecordset].Id = CFV.CustomRecordsetId 
     INNER JOIN (SELECT CustomFieldId, Label FROM [CustomField2Lexicon]) CF2L 
     ON CF2L.CustomFieldId = CFV.CustomFieldId 
     WHERE [File].Id = SelectionCache.RecordId 
     AND SelectionCache.UUID = @UUID 
     AND SelectionCache.TableCode = @TableCode -- this is the code for File table 
     AND  [File].Id <> 0 
     AND  [File].FileTypeId = FileType2Lexicon.FileTypeId 
     AND  FileType2Lexicon.LexiconId = @LexiconId 
     AND  [File].ClientIdString = [People].ClientIdString 
     AND  CFV.Value <> '' 
     AND  CF2L.Label = 'Date of Arrest' 

Cette version choisit arbitrairement l'ID maximum. DISTINCT ne fonctionne pas sur les types de données stockés dans la table.

+0

Merci pour l'aide. – Abyssul

Questions connexes