【问题标题】:Stored Procedure is returning duplicate records存储过程返回重复记录
【发布时间】:2017-04-10 14:23:42
【问题描述】:

我有以下7个表:

1) 标题

ID    Title                                                        Author         
-------------------------------------------------------------------------
1     The Hidden Language of Computer Hardware and Software   Charles Petzold
2     Paths, Dangers, Strategies                              Nick Bostrom
3     The Smart Girl's Guide to Privacy                       Violet Blue
4     Introduction to Algorithms                              Thomas H. Cormen
5     Machine Learning in Action                              Peter Harrington
...

2) 主题

ID         Name
------------------------------------------
1          Science Fiction
2          Biography
3          Painting
...

3) 主题

ID           Name
-----------------------------------
1            Science 
2            Technology
3            Music
4            Geography
...

4) 成绩

ID            Name
------------------------------------
1             Grade 1
2             Grade 2
3             Grade 3
4             Grade 4
5             Grade 5
...

5) 标题主题关联

TitleID         ThemeID
------------------------------------------
1               1
1               3
4               2
4               3
...

6) 标题主题关联

TitleID          SubjectID
---------------------------------
1                1
1                3
2                1
2                3 
4                1
4                2  
...

7) TitleGradeAssociaton

TitleID              GradeID
1                    1
1                    2
1                    3
2                    1
2                    2
...

我有一个存储过程如下:

CREATE PROCEDURE [dbo].[GetTitlesPageWise]
       @PageIndex INT = 1
      ,@PageSize INT = 10
      ,@searchText NVARCHAR(250) = ''
      ,@PageCount INT OUTPUT
AS
BEGIN
      SET NOCOUNT ON;
      SET FMTONLY OFF;

select ROW_NUMBER() over 
       (
         ORDER BY [id] ASC
       ) as RowNumber,
        T.Id As [Title ID],
        T.Title,
        H.Theme,
        S.Subject,
        G.Grade
into #Results
From    Titles  T
Outer Apply
(
    Select  Stuff(( Select ', ' + Name 
                    From    Themes                  H
                    Join    TitleThemeAssociaton   TH  On  H.Id = TH.ThemeId
                    Where   TH.TitleId = T.Id 
                    For Xml Path('')), 1, 2, '') As Theme
    From    Themes
) H
Outer Apply
(
    Select  Stuff(( Select ', ' + Name 
                    From    Subjects                S
                    Join    TitleSubjectAssociation  TS  On  S.Id = TS.SubjectId
                    Where   TS.TitleId = T.Id 
                    For Xml Path('')), 1, 2, '') As Subject
    From    Subjects
) S
Outer Apply
(
    Select  Stuff(( Select ', ' + Name 
                    From    Grades                  G
                    Join    TitleGradeAssociation    TG  On  G.Id = TG.GradeId
                    Where   TG.TitleId = T.Id 
                    For Xml Path('')), 1, 2, '') As Grade
    From    Grades
) G
WHERE
    t.title Like @searchText + '%'
    AND
    (
        H.Theme Is Null
        Or      S.Subject Is Null
        Or      G.Grade Is Null
    )

      DECLARE @RecordCount INT
      SELECT @RecordCount = COUNT(*) FROM #Results

      SET @PageCount = CEILING(CAST(@RecordCount AS DECIMAL(10, 2)) / CAST(@PageSize AS DECIMAL(10, 2)))
      PRINT       @PageCount

      SELECT * FROM #Results
      WHERE RowNumber BETWEEN(@PageIndex -1) * @PageSize + 1 AND(((@PageIndex -1) * @PageSize + 1) + @PageSize) - 1

      DROP TABLE #Results
END

我想要不同的标题 ID,输出如下所示,但查询给出了重复的结果。如果 Theme、Subject 和 Grade 都分配了值,则该记录应从结果中排除。在上述情况下,应该排除 Title ID 1,因为所有三个值都存在于那里。我需要帮助来解决问题。

RowNumber    Title ID           Title          Theme       Subject     Grade
1            2  Paths, Dangers, Strategies      NULL       Science , Music  Grade 1, Grade 2
2            3  The Smart Girl's Guide to Privacy   NULL    NULL       NULL
3            4  Introduction to Algorithms   Biography, Painting    Science , Technology    NULL
4            5  Machine Learning in Action  NULL    NULL    NULL

.............

【问题讨论】:

  • 您的预期结果是什么?

标签: sql-server stored-procedures


【解决方案1】:

SQL DEMO

SELECT 
       ROW_NUMBER() OVER  (ORDER BY [ID]) rn, 
       [ID],
       [Title],
       Subject = STUFF ((
                      SELECT ',' + S.[Name] 
                      FROM TitleSubjectAssociation TS
                      JOIN Subjects S
                        ON TS.SubjectId = S.Id 
                      WHERE TS.[TitleID] = T.[ID]
                      FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)'), 1, 1, ''
                    ),
       Theme = STUFF ((
                      SELECT ',' + TH.[Name] 
                      FROM TitleThemeAssociation TA
                      JOIN Themes TH
                        ON TA.[ThemeID] = TH.[ID]
                      WHERE TA.[TitleID] = T.[ID]
                      FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)'), 1, 1, ''
                    ),
       Grade = STUFF ((
                      SELECT ',' + G.[Name] 
                      FROM TitleGradeAssociation TG
                      JOIN Grades G
                        ON TG.[GradeID] = G.[ID]
                      WHERE TG.[TitleID] = T.[ID]
                      FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)'), 1, 1, ''
                    )                                        
FROM Titles T;

如果您需要过滤器,可以尝试检查结果中有多少 ,。两个, 表示三个元素。

WHERE len(Subject) - len(replace(Subject,',','')) != 2
  AND len(Theme) - len(replace(Theme,',','')) != 2
  AND len(Grade) - len(replace(Grade,',','')) != 2

输出

【讨论】:

  • 我需要排除所有三个值主题、主题和等级都存在的标题。在上述数据集中,应排除 Title ID 1,因为所有三个值都存在。
  • 你之前什么都没说 :( 你确定只有 3 行吗?你的数据表明每张桌子上有更多的行
  • 表中有数千条记录,我需要从包含主题、主题和等级的所有三个值的结果中排除这些记录。在帖子中,我只显示了几条记录,Title ID 1 包含所有值,记录从结果集中删除。
  • 这不满足我的查询。我需要排除那些主题、主题和等级至少有一个值的标题。如果任何标题具有主题或主题或成绩,则应在结果集中显示。在上述测试结果集中,标题 1 包含排除的主题、主题和成绩。
  • 您的要求不明确。加倍努力,用问题的例子解释你的所有情况,然后告诉我。
猜你喜欢
  • 1970-01-01
  • 2019-04-20
  • 2017-05-06
  • 2015-10-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-04
相关资源
最近更新 更多