sql - 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 让我失望了。)
解决方案
试试这个
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
推荐阅读
- python - 不能将 TimeDistributed 与 LSTM 一起使用
- firebase - 值事件如何处理 Firebase 监听器的更新?
- machine-learning - 为什么输出 LSTM 层的维度可以是 2 维或 3 维?
- mysql - MySQL:基于另一列的值的列的总和
- multithreading - Rails Thread.current 变量是否与单个用户请求隔离?
- javascript - 什么构成用户手势
- c# - 为什么嵌入自定义清单文件后某些方法不起作用?
- macos - 如何创建始终在后台运行并收集位置的mac应用程序?
- python - 无法迭代二维数组以标准化数据
- mysql - 如何管理大数据库站点?我的网站有 20k 个页面,数据库大小为 3gb