2013-06-13 6 views
2

Мне нужно объединить несколько таблиц в базе данных SQL Server, чтобы использовать поля в построителе отчетов. Этот SQL-запрос запускается как хранимая процедура. Проблема в том, что он возвращает несколько строк, которые я считаю дублирующими.Удалить дубликаты на основе одного столбца

Вот мой запрос (некоторые структурные части были вынуты):

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' 

Это заканчивается возвращением:

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 

Как видно, строки дублируют из столбца recordsetId. Каждая строка таблицы также имеет собственный UUID.

Любые идеи? Я работаю над этим целыми днями.

EDIT: Вот мое решение, которое я нашел.

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 

ответ

1

Вы думали об использовании либо ...

SELECT DISTINCT [FILE].*, (etc) 

Или даже ...

GROUP BY [FILE].id 
+0

DISTINCT не работает с типами данных, которые хранятся в таблице. Я попробовал перебросить их в соответствующие типы данных, но я никогда не смог заставить его работать. Я действительно придумал решение. Спасибо за помощь. – Abyssul

+0

Чтобы помочь сообществу в стеке, напишите свой ответ, чтобы другие могли его узнать;) –

+1

Я разместил его в своем оригинальном посте в качестве редактирования. Благодарю. – Abyssul

0

Если проблема RecordSetId, то группа остальной части колонны и использовать агрегацию для этого. Или исправить проблему путем агрегирования набора записей:

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' 

Эта версия произвольно выбирает максимальный идентификатор.

+0

Спасибо за помощь. – Abyssul

Смежные вопросы