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 &lt; 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 join right inner join 区别

LEFT OUTER JOIN with 'field IS NULL' in WHERE 用作 INNER JOIN

Mysql LEFT JOIN with count 返回未知列

Oracle left outer join with is null in JOIN vs WHERE 条件(示例)