首页 > 解决方案 > ManyToMany,KeyTable1 中与 KeyTable2 中选定项目匹配的最小键集?(我需要 w,x,y,z 类,最少有哪些老师可以满足)?

问题描述

在多对多关系中,我试图解决一个问题,即我需要从第一个表中找到最小的项目集,这些项目为第二个表中的任意一组选定项目提供覆盖。

例如,想象:
教师(TeacherID)
班级(ClassID)
TeachClassXref(教师ID,ClassID)

如果学生需要上课:34,45,53,56,44,77,23,654,667

如何确定可以教授这些课程的最小教师 ID 集?

(另待确定:在无法完全覆盖的情况下,无共同教师的异常类。)


或使用来自不同域的术语(但完全相同的表结构):

活动和角色:如果我需要执行活动 1、3、6、7、9、33、45,我需要属于哪个角色或一组角色?

(我确信这个问题必须有一个名字,但我的 google-fu 让我失望了。)

标签: sqlsql-servermany-to-many

解决方案


试试这个

SELECT
ClassID
into #RequiredClass
from CLass
where ClassID in (34,45,53,56,44,77,23,654,667)


create table #BestTeacher (TeacherID int)

while 1 = 1
begin

insert  #BestTeacher
SELECT top 1
  Teacher.TeacherID
FROM
  Teacher
  INNER JOIN TeacherClass
          ON Teacher.TeacherID = TeacherClass.TeacherID
  INNER JOIN #RequiredClass as Class
          ON TeacherClass.ClassID = Class.ClassID 
GROUP BY
  Teacher.TeacherID
  ,Teacher.TeacherName
order by count(Teacher.TeacherID) desc


delete #RequiredClass
where ClassID in (

 SELECT
#RequiredClass.ClassID
from #RequiredClass 
inner join 
  Teacher
  INNER JOIN TeacherClass
          ON Teacher.TeacherID = TeacherClass.TeacherID
  INNER JOIN Class
          ON TeacherClass.ClassID = Class.ClassID
on #RequiredClass.ClassID = Class.ClassID
inner join #BestTeacher
on #BestTeacher.TeacherID = Teacher.TeacherID)

   if @@rowcount = 0 break
end


select * from #BestTeacher
drop table #BestTeacher
drop table #RequiredClass

推荐阅读