在课程表和课程表之间加入条件

时间:2017-11-27 21:28:17

标签: sql join data-warehouse peoplesoft

所以这个问题可能对在高等教育中工作的人更有意义。

我有课程表,课程开始日期和课程结束日期以及课程代码和机构字段,我还有课程表,课程有效日期,课程有效期,课程代码和机构字段。

以前的逻辑是加入course_code,机构和班级开始日期是在课程生效日期和课程到期日期之间。 (见下面的例子)

现在需要重写这个连接条件,因为有些类属于在课程生效日期之前开始的课程,并且这些课程在内部联接期间被删除。

问题 - 由于我没有任何其他字段可以加入,但是机构和course_code除外,有什么方法可以重写这段代码吗?我试图将连接更改为外连接,并且它正在创建重复项。

PS: - 我对这些东西很陌生,所以任何建议都非常有帮助。

  Select crse_id, institution, class_start_date, class_end_date
  FROM PS_CLASS_TBL class
  Inner join PS_CRSE_CATALOG CATALOG ON 
  (
  CATALOG.CRSE_ID = class.CRSE_ID and
  Catalog.INSTITUTION = class.INSTITUTION 
  AND CATALOG.Course_Effective_Date <= class.START_DT
  AND CATALOG.Course_Expiration_Date >= class.START_DT
  )

2 个答案:

答案 0 :(得分:1)

您可能需要考虑重构您的设计并向课程添加类似CourseId的内容,这样您的联接就会变得简单而有效......

如果你想保留当前的设计,你可以使用函数ADDDATE来为class.START_DT添加一些时间,例如,在将它与Course_Effective_Date进行比较之前,将start_date添加10天:

CATALOG.Course_Effective_Date <= ADDDATE(day, 10, class.START_DT)

这样,课程可以在课程开始前10天开始:

注意:此语法适用于MS SQL SERVER,不确定您使用的是哪个数据库。

Select crse_id, institution, class_start_date, class_end_date
FROM PS_CLASS_TBL class
Inner join PS_CRSE_CATALOG CATALOG ON 
(
  CATALOG.CRSE_ID = class.CRSE_ID AND
  Catalog.INSTITUTION = class.INSTITUTION AND
  CATALOG.Course_Effective_Date <= ADDDATE(day, 10, class.START_DT) AND
  CATALOG.Course_Expiration_Date >= class.START_DT
)

如果您使用的是其他数据库,则可能需要稍微更改ADDDATE的语法,但基本相同。

答案 1 :(得分:1)

如果可能出现任何重叠,您可能需要这样做:

Select crse_id, institution, class_start_date, class_end_date
FROM PS_CLASS_TBL class
Inner join PS_CRSE_CATALOG CATALOG ON 
(
CATALOG.CRSE_ID = class.CRSE_ID and
Catalog.INSTITUTION = class.INSTITUTION 
AND (
  CATALOG.Course_Effective_Date BETWEEN class.START_DT AND class.END_DT
  OR
  CATALOG.Course_Expiration_Date BETWEEN class.START_DT AND class.END_DT
  )
)