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
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
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;) –
Je l'ai posté dans mon message original comme un edit. Merci. – Abyssul