2016-06-07 7 views
0

Ich habe diese beiden Abfragen.Join unabhängig Tabelle und Suche nach verfügbaren Datum

Abfrage 1:

SELECT fex.availableID, fex.lecturerID, fex.freedate, 
ex.lecturerID AS Examiner, ex.lecturerFullname, 
v.availableID, v.availableDay, v.availableStart, v.availableEnd, v.availableEnd 
FROM free fex 
INNER JOIN lecturer ex 
ON fex.lecturerID = ex.lecturerID 
INNER JOIN availability v 
ON fex.availableID = v.availableID 

Abfrage 2:

SELECT s.studentID, s.studentName, s.projectTitle, s.lecturerID AS supervisor, 
sv.lecturerID, sv.lecturerFullname, 
fsv.availableid, fsv.lecturerid, fsv.freedate 
FROM student s 
INNER JOIN lecturer sv 
ON s.lecturerID = sv.lecturerID 
INNER JOIN free fsv 
ON s.lecturerID = fsv.lecturerID 

Wie Sie Dozenten hier spielt zwei Rollen sehen, die supervisor und examiner sind. Abfrage 1 zeigt die Abfrage für examiner. Abfrage 2 zeigt die Abfrage für supervisor und ihre Schüler.

Datenbank-Schema:

Frei:

availableID (number) 
lecturerID (varchar2) 
freedate (Date) 

Dozent:

lecturerID (varchar2) 
lecturerFullname (varchar2) 

Verfügbarkeit:

availableID (number) 
availableDay (varchar2) 
availableStart (Date) //Time 
availableEnd (Date) //Time 
availableDate (Date) 

Student:

studentID (varchar2) 
studentName (varchar2) 
Projecttitle (varchar2) 
lecturerID(varchar2) 

Zunächst möchte ich diese beiden Abfragen verbinden. Da sie nicht verwandt sind. Ich habe versucht, CROSS JOIN zu verwenden, aber ich habe unendlich Ergebnis.

Zweitens, nachdem die Abfrage verknüpft ist. Ich möchte, dass die Abfrage das supervisor ODER das examiner findet, in dem eins von ihnen Wert in freedate hat (zB: 10-05-2016). Da die meisten von ihnen einen Nullwert in freedate haben. Nur bestimmte Dozenten haben einen Wert darauf.

Dann wird es ein Abfrageergebnis produzieren, wo es so etwas wie dies zeigt:

studentID studentName projectTitle supervisor examiner availableID availableDay  freeDate 
    123   hunter   abc   mary  kent  10   Tuesday   10-05-2016 

Zum Beispiel kann der Prüfer hat freedate 2016.10.05. Der Supervisor hat einen Nullwert von freedate.

Oder gibt es vielleicht einen effizienten Weg?

+0

Es ist unklar, wie die Daten "zusammenkommen". Wenn Sie einige Beispieldaten hinzufügen können, die Ihren gewünschten Ergebnissen entsprechen, können wir sie möglicherweise besser verstehen. – sstan

Antwort

0

so etwas wie

SELECT fex.availableID, fex.lecturerID, fex.freedate, 
ex.lecturerID AS Examiner, ex.lecturerFullname, 
v.availableID, v.availableDay, v.availableStart, v.availableEnd, v.availableEnd 
FROM free fex 
INNER JOIN lecturer ex 
ON fex.lecturerID = ex.lecturerID 
INNER JOIN availability v 
ON fex.availableID = v.availableID 
CROSS APPLY 
(
SELECT s.studentID, s.studentName, s.projectTitle, s.lecturerID AS supervisor, 
sv.lecturerID, sv.lecturerFullname, 
fsv.availableid, fsv.lecturerid, fsv.freedate 
FROM student s 
INNER JOIN lecturer sv 
ON s.lecturerID = sv.lecturerID 
INNER JOIN free fsv 
ON s.lecturerID = fsv.lecturerID 
WHERE sv.lecturerID = ex.lecturerID 
) DQ 
0

Wie ich aus den Datenbanktabellen sehen kann, haben alle einen gemeinsamen Schlüssel verbunden werden.

Datenbank-Schema:

Frei:

availableID (Zahl) lecturerID (varchar2) freedate (Datum)

Dozent:

lecturerID (varchar2) lecturerFullname (varchar2)

Verfügbarkeit:

availableDay

availableID (Anzahl) (varchar2) availableStart (Datum) availableEnd (Datum) // Time availableDate (Datum)

Student:

studentID (varchar2) student (varchar2) Projecttitle (varchar2) lecturerID (varchar2)

SELECT * 
    FROM FREE FR, LECTURER LR, AVAILABILITY AV, STUDENT ST 
    WHERE FR.AVAILABLEID = AV.AVAILABLEID 
    AND LR.LECTURERID = FR.LECTURERID 
    AND ST.LECTURERID = FR.LECTUREID 

Aber, da Sie erwähnt haben, dass die beiden unterschiedlich sind, können Sie UNION für die gleiche verwenden.

SELECT fex.availableID, fex.lecturerID, fex.freedate, 
ex.lecturerID AS Examiner, ex.lecturerFullname, 
v.availableID, v.availableDay, v.availableStart, v.availableEnd, v.availableEnd 
FROM free fex 
INNER JOIN lecturer ex 
ON fex.lecturerID = ex.lecturerID 
INNER JOIN availability v 
ON fex.availableID = v.availableID 
UNION 
SELECT s.studentID, s.studentName, s.projectTitle, s.lecturerID AS    supervisor, 
sv.lecturerID, sv.lecturerFullname, 
fsv.availableid, fsv.lecturerid, fsv.freedate 
FROM student s 
INNER JOIN lecturer sv 
ON s.lecturerID = sv.lecturerID 
INNER JOIN free fsv 
ON s.lecturerID = fsv.lecturerID 

Der UNION-Operator wählt standardmäßig nur bestimmte Werte aus. Um doppelte Werte zuzulassen, verwenden Sie das Schlüsselwort ALL mit UNION.

Verwandte Themen