如何合并关联provas与含多外键horarios表的SQL查询?
合并考试表与时间表的SQL查询方案
没问题,我来帮你把这两个查询合并起来,顺便修正原查询里的一些小问题:
- 两个原查询里都有
表.id = 表.id这种完全冗余的条件,完全可以去掉 - 第一个查询里的
AND provas.id_horario JOIN horarios ON ;是语法错误,这种写法不符合SQL规范
合并后的完整查询(推荐显式JOIN写法,更清晰易维护)
SELECT provas.id, disciplinas.disciplina, disciplinas.grupo, salas.sala, dias.dia, meses.nome AS mes, horas.hora, minutos.minuto FROM provas JOIN disciplinas ON provas.id_disciplina = disciplinas.id JOIN salas ON provas.id_sala = salas.id JOIN horarios ON provas.id_horario = horarios.id JOIN dias ON horarios.id_dia = dias.id JOIN meses ON horarios.id_mes = meses.id JOIN horas ON horarios.id_hora = horas.id JOIN minutos ON horarios.id_minuto = minutos.id;
逻辑说明
- 从
provas(考试表)出发,通过外键关联disciplinas(科目表)和salas(教室表),拿到考试对应的科目、分组和教室信息 - 通过
provas.id_horario关联到horarios(时间表),再从时间表分别关联到dias(日期表)、meses(月份表)、horas(小时表)、minutos(分钟表),获取完整的时间维度数据 - 给
meses.nome起别名mes,让结果集的字段名更直观
简洁优化版(使用表别名缩短代码)
如果想让代码更简洁,也可以给每个表设置别名:
SELECT p.id, d.disciplina, d.grupo, s.sala, di.dia, m.nome AS mes, h.hora, mi.minuto FROM provas p JOIN disciplinas d ON p.id_disciplina = d.id JOIN salas s ON p.id_sala = s.id JOIN horarios ho ON p.id_horario = ho.id JOIN dias di ON ho.id_dia = di.id JOIN meses m ON ho.id_mes = m.id JOIN horas h ON ho.id_hora = h.id JOIN minutos mi ON ho.id_minuto = mi.id;
内容的提问来源于stack exchange,提问作者Ordnael Susej
相关产品推荐
相关产品推荐

