2017-11-27 8 views
1

, so dass diese Frage für Personen, die in der Hochschulbildung arbeiten, sinnvoller ist.Verbinden Sie den Zustand zwischen Klassen- und Kurstabellen

Ich habe eine Klassentabelle mit Klassenstartdatum und Klassenenddatum zusammen mit Kurscode und Institutionsfeldern, ich habe auch eine Kurstabelle mit Kurs-Gültigkeitsdatum, Kursablaufdatum, Course_code und Institutionsfeldern.

Zuvor war die Logik der Teilnahme am course_code, der Institution und dem Klassenstartdatum zwischen dem Kursgültigkeitsdatum und dem Kursablaufdatum. (siehe Beispiel unten)

Diese Join-Bedingung muss jetzt neu geschrieben werden, da einige Klassen zu einem Kurs gehören, die vor dem Kurs-Gültigkeitsdatum beginnen und diese Klassen während des inneren Joins gelöscht wurden.

Frage - Da ich keine anderen Felder haben kann außer institution und course_code, gibt es eine Möglichkeit, diesen Code neu zu schreiben? Ich habe versucht, den Join zu Outer Join zu ändern, und es erstellt Duplikate.

PS: - Ich bin neu zu viel von diesem Zeug, so dass jeder Vorschlag sehr hilfreich ist.

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

welche Datenbank verwenden Sie? – Sarhang

+0

Es gibt Kurse in einem Kurs, die vor dem Kursdatum des Kurses beginnen? Das ergibt keinen Sinn. PeopleSoft verwendet Felder mit "Gültigkeitsdatum", sodass eine Datenzeile nicht vor dem Datum des Inkrafttretens oder nach dem veralteten Datum verwendet werden darf. Warum gibt es Kurse, die vor dem Kursdatum des Kurses beginnen? –

Antwort

1

Sie möchten vielleicht Refactoring Ihr Design zu betrachten und das Hinzufügen von etwas wie courseid zu Klasse, auf diese Weise Ihre beitreten wäre einfach und effizienter ...

wenn Sie das aktuelle Design behalten möchten, können Sie Funktion ADDDATE verwenden können, einige Zeit in Anspruch class.START_DT, beispielsweise hinzufügen, fügen sie 10 Tage vor start_date es mit Course_Effective_Date Vergleich:

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

auf diese Weise kann die Klasse bis zu 10 Tagen beginnen, bevor Course:

HINWEIS: Diese Syntax ist für MS SQL SERVER, nicht sicher, welche DB Sie verwenden.

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 
) 

Wenn Sie einen anderen DB verwenden, müssen Sie möglicherweise etwas die Syntax von ADDDATE ändern, aber im Grunde die gleiche Idee.

+1

Vielen Dank! Ich werde diese Methode versuchen, ich benutze MS SQL Server-Datenbank. Ich habe vergessen, das in der ursprünglichen Frage zu erwähnen. – Datawarehousedeveloper

1

Wenn jede Art von Überlappung möglich ist, können Sie soweit gehen müssen:

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 
) 
) 
Verwandte Themen