【发布时间】:2018-11-28 17:59:41
【问题描述】:
我有一个包含许多 JOINS 的报表,报表的基础是一个名为“table_class”的表 (c)。我需要将此表(table_class)的日期时间字段与另一个名为“table_period”的表进行比较。问题是表“table_period”与“table_class”没有关系。当“table_class”的开始日期字段(日期时间)介于“table_period”的开始日期和结束日期(均为日期时间)之间时,我需要显示“table_period”的PK。
基本上,我想根据班级发生/发生的时期按班级显示时期。
重要:“table_period”在用户级别是灵活的,因为该期间没有固定日期。
例如:
2016年第一学期:2016年1月1日至2016年6月30日
2016年第二学期:2016年7月1日至2016年12月31日
2017年第一学期:2017年2月1日至2017年7月31日
2017年第二学期:2017年8月1日至2018年1月31日
然后继续……所以,我无法修复这个时期。
我们怎样才能做到这一点?是否可以在这种情况下创建 JOIN,甚至可以使用 CASE 表达式解决?
为了更好地说明,我们可以在下面查看这些表格的示例。
表 1:table_class (c)(提醒此表是报告的基础)
CLASS_ID | START_DTE | END_DTE
0001 | Jun 29, 2017, 8:00 AM | Jun 29, 2017, 3:30 PM
0002 | Jan 11, 2018, 8:00 AM | Jan 12, 2018, 3:30 PM
...
表 2:table_period (p)
PERIOD_ID | START_DTE | END_DTE
1st semester 2016 | Jan 1, 2016, 3:00 AM | Jun 30, 2016, 1:00 AM
2nd semester 2016 | Jul 1, 2016, 1:00 AM | Dec 31, 2016, 3:00 AM
1st semester 2017 | Feb 1, 2017, 3:00 AM | Jul 31, 2017, 1:00 AM
2nd semester 2017 | Aug 1, 2017, 1:00 AM | Jan 31, 2018, 3:00 AM
...
我的期望
c.CLASS_ID | p.PERIOD_ID | c.START_DTE | c.END_DTE
0001 | 1st semester 2017 | Jun 29, 2017, 8:00 AM | Jun 29, 2017, 3:30 PM
0002 | 2nd semester 2017 | Jan 11, 2018, 8:00 AM | Jan 12, 2018, 3:30 PM
...
谢谢!
【问题讨论】:
-
您是否尝试过简单的连接 [table_class c join table_period p on c.start_date between p.start_date and p.end_date]?
-
@MaximBurunov,我以前没试过这个!但按预期工作!谢了!
-
加入不需要“关系”(FK)。每个连接都是有意义的。内部联接执行交叉联接并仅保留满足 on 条件的行。或者你可以交叉加入并在哪里使用。只写你想要的条件。
-
@philipxy,感谢您的解释!