【问题标题】:JOIN with tables without relationship加入没有关系的表
【发布时间】: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,感谢您的解释!

标签: sql join oracle11g case


【解决方案1】:

您可以像这样发送join

select c.*, p.period_id
from table_class c left join
     table_period p
     on c.start_dte < p.end_dte and c.start_dte >= p.start_dte;

这会根据课程开始的时间分配时间段(如果有的话)。

【讨论】:

    猜你喜欢
    • 2021-04-23
    • 2021-06-22
    • 2020-12-25
    • 1970-01-01
    • 2021-05-28
    • 1970-01-01
    • 2015-12-29
    • 2021-06-19
    • 1970-01-01
    相关资源
    最近更新 更多