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 があります。

何か案は?私はこれに何日も取り組んできました。

編集:これが私が見つけた私の解決策です。

    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
4

2 に答える 2

1

どちらかを使用することを考えましたか...</p>

SELECT DISTINCT [FILE].*, (etc)

または…</p>

GROUP BY [FILE].id
于 2013-06-13T15:04:48.390 に答える
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'

このバージョンは任意に最大 ID を選択します。

于 2013-06-13T15:32:16.583 に答える