Left Join with same table and group by 以相反的顺序返回重复的元组
Posted
技术标签:
【中文标题】Left Join with same table and group by 以相反的顺序返回重复的元组【英文标题】:Left Join with same table and group by is returning duplicated tuples with reverse order 【发布时间】:2020-05-25 23:21:47 【问题描述】:我正在尝试查询包含以下列的数据库(不归我所有):
NumEpoca (epoch), Turma(class), Dia (day - indicates day of the week),
Hora (hour - each value indicates a 30mins time, a 3h class generate 6 tuples),
Disciplina (course), TipoAula (type of class, theoretical or practical),
Sala (clas-s-room)
这基本上是一个课程表,所以对于一个给定的课程,我可以在一周的同一天上一节实践课,另一个星期上理论课。
现在,我想获取给定日期的最短和最长小时数(这样我就可以计算课程的开始和结束时间),但我也想为他们获取教室,但我没有先验地知道它是理论课还是实践课。
另外,有些课只是实践课,有些课只是理论课,所以我只想要一间教室。
我正在做的查询,基本上给了我除了
LectureDetails(beginDate=2020-05-26 15:30:00, endDate=2020-05-26 18:30:00, clas-s-room=L_H1/G.0.08)
LectureDetails(beginDate=2020-05-26 15:30:00, endDate=2020-05-26 18:30:00, clas-s-room=G.0.08/L_H1)
正如您在此处看到的,我上的是同一堂课(对于 Teo 和 Pract 的 2 个教室,在同一时间开始和结束。但那天我只需要 1 个元组,我得到的是 L_H1/G。 0.08 和 G.0.08/L_H1。
"SELECT a1.Dia,MIN(a1.Hora),MAX(a1.Hora),a1.Sala, a2.Sala FROM Aulas as a1 LEFT JOIN Aulas as a2 " +
"on a1.Sala <> a2.Sala and a1.Disciplina = a2.Disciplina and a1.NumEpoca = a2.NumEpoca and a1.Turma = a2.Turma " +
"and a1.Dia= a2.Dia and a1.Hora = a2.Hora " +
"where NumEpoca = ? AND Turma = ? AND Disciplina=? GROUP BY a1.Dia,a1.Sala,a2.Sala"
提前致谢。
【问题讨论】:
请在代码问题中给出minimal reproducible example--cut & paste & runnable code,包括最小的代表性示例输入作为代码;期望和实际输出(包括逐字错误消息);标签和版本;明确的规范和解释。给出尽可能少的代码,即您显示的代码可以通过您显示的代码扩展为不正常的代码。 (调试基础。)对于包含 DBMS 和 DDL(包括约束和索引)和输入为格式化为表的代码的 SQL。 How to Ask 暂停总体目标的工作,将代码砍到第一个表达式,没有给出你期望的内容,说出你期望的内容和原因。 在一行中只获取给定值对的一个副本是一个常见问题。在考虑发布之前,请阅读您的教科书和/或手册和谷歌任何错误消息或您的问题/问题/目标的许多清晰、简洁和精确的措辞,有和没有您的特定字符串/名称和站点:***.com 和标签;阅读许多答案。如果您发布问题,请使用一个短语作为标题。反映你的研究。请参阅How to Ask 和投票箭头鼠标悬停文本。 PS请合理格式化代码。 PS只需从您的标题中搜索“具有相反顺序的重复元组”即可返回回答此问题的点击数。 这能回答你的问题吗? SQL -- Remove duplicate pairs 我不想删除重复的元组,因为它们甚至没有重复。他们只是换了顺序。而且我需要在没有订单的情况下得到东西,而不仅仅是删除一些东西。 Shawnt00 给了我我需要的答案。 您似乎没有阅读链接的问答,因为他们清楚地在谈论您是什么,而答案恰恰说明了已接受答案的第一行的作用--很明显--提问者恰好用“重复”这个词来描述有 (a,b) & (b,a) & 用“删除”这个词来表示不选择。 【参考方案1】:您可以通过使用a1.Sala < a2.Sala
而不是不等式来消除排序错误的结果。
但这并不是你真正想要的方法。试试这样的:
SELECT Dia, MIN(Hora), MAX(Hora),
MIN(Sala),
CASE WHEN MIN(Sala) = MAX(Sala) THEN NULL ELSE MAX(Sala) END
FROM Aulas
WHERE NumEpoca = ? AND Turma = ? AND Disciplina = ?
GROUP BY Dia
【讨论】:
哇,我在看聚合函数,所以我必须对它们进行分组,我就像“我不可能使用这个”,20 分钟后它们救了我。非常感谢您的帮助!以上是关于Left Join with same table and group by 以相反的顺序返回重复的元组的主要内容,如果未能解决你的问题,请参考以下文章
(', CROSS, FULL, INNER, JOIN, LEFT, NATURAL, ON, RIGHT 或 USING 预期,得到'WITH'
MySQL Left Join Subquery with *
LEFT OUTER JOIN with 'field IS NULL' in WHERE 用作 INNER JOIN