所以这个问题可能对在高等教育中工作的人更有意义。
我有课程表,课程开始日期和课程结束日期以及课程代码和机构字段,我还有课程表,课程有效日期,课程有效期,课程代码和机构字段。
以前的逻辑是加入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
)
答案 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
)
)