Мне нужно объединить несколько таблиц в базе данных 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
DISTINCT не работает с типами данных, которые хранятся в таблице. Я попробовал перебросить их в соответствующие типы данных, но я никогда не смог заставить его работать. Я действительно придумал решение. Спасибо за помощь. – Abyssul
Чтобы помочь сообществу в стеке, напишите свой ответ, чтобы другие могли его узнать;) –
Я разместил его в своем оригинальном посте в качестве редактирования. Благодарю. – Abyssul