【问题标题】:Find duplicates across many to many relationship in SQL Server在 SQL Server 中查找多对多关系中的重复项
【发布时间】:2021-03-14 09:29:27
【问题描述】:

我正在尝试在 SQL Server 数据库中的多对多连接中查找潜在的重复项。 我有一个学生上课的数据库,并有以下表格:课程、参加者、教室和学生。 我正在尝试查找同一组学生可能已在同一日期和教室两次输入的重复项。 学生到课程是由参加者表分解的多对多。 LessonID、StudentID、ClassroomID 字段是 SQL Server 标识主键。参加者只是一个带有学生和课程复合键的连接表。

课程: 课程编号 上课日期 教室编号

学生: 学生证

参加者: 课程编号 学生证

教室: 教室编号

同一组学生可能在同一天在同一个教室参加不同的课程是合理的,但我想将他们标记为潜在的重复,以防记录被错误地输入了两次。 我不知道如何在同一日期为同一教室找到匹配的学生组。

因此,我希望找到的重复数据示例如下:

课程:

+------------+-------------+------------+ |课程ID |教室ID |上课日期 | +------------+-------------+------------+ | 335867 | 347 | 2020 年 6 月 1 日 | | 335872 | 347 | 2020 年 6 月 1 日 | +------------+-------------+------------+

参加者:

+----------+----------+ |课程ID |个人ID | +----------+----------+ | 335867 |第432章 | 335867 |第1398章 | 335867 | 5107 | | 335872 |第432章 | 335872 |第1398章 | 335872 | 5107 | +----------+----------+

另一种看待这个问题的方式是:对于任何给定的课程,哪些其他课程(如果有)在同一天在同一教室有相同的学生。

【问题讨论】:

  • 样本数据、预期结果和您的尝试将帮助我们帮助您。这闻起来像家庭作业(我不是说它是,但它有它的感觉),所以如果是的话,我们为你做你的工作不会帮助你。你做了哪些研究来尝试完成这项任务?
  • 你好拉努。因为新冠肺炎,我在家工作,所以我想你可以说这是我的作业,但我真的很感谢你的帮助。我将发布示例数据...
  • @PhilHawkridge 您可以使用dbfiddle.uk 创建minimal reproducible example

标签: sql-server duplicates many-to-many


【解决方案1】:

我自己找到了一个解决方案,使用 STRING_AGG 函数来展平层次结构。我在数据库中添加了以下查询:

选择 Lessons.LessonID、Lessons.ClassroomID、Lessons.LessonDate、string_agg(Attendees.StudentID, '-') 作为团队
FROM 课程 INNER JOIN
参加者 ON Lessons.LessonID = 参加者.LessonID
按Lessons.LessonID、Lessons.ClassroomID、Lessons.LessonDate 分组

这给出了如下所示的课程数据:

+---+----+------------+--------------+ | 1 | 17 | 2006-01-04 | 3-5-10-23 | | 2 | 18 | 2006-01-04 | 2-17-252 | | 3 | 18 | 2006-01-04 | 2-16-18 | | 4 | 18 | 2006-01-04 | 2-6-11-16-18 | +---+----+------------+--------------+

然后我可以简单地查询。 我将把它变成一个存储过程,传递给我选择的课程:LessonDate、ClassroomID 和它自己的“STRING_AGG”学生团队,作为过滤器。

STRING_AGG 函数仅在 SQL Server 2017 中可用。因此,对于旧版本,您可以使用 FOR XML PATH('') 语法,用连字符连接,用 STUFF 删除前导连字符:

选择 dbo.Lessons.LessonID、dbo.Lessons.ClassroomID、dbo.Lessons.LessonDate,
(
东西(
(选择'-' + cast(StudentId as varchar(10))
来自与会者
WHERE Attendees.LessonId = Lessons.Lessonid
FOR XML 路径('')
),1,1,'')
)
作为团队
FROM dbo.Lessons

如果愿意,您可以用逗号代替标准 CSV 格式连接。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-01-16
    • 2019-04-13
    • 2015-07-24
    • 1970-01-01
    • 2019-08-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多