2016-06-07 4 views
0

У меня эти два запроса.Объединение несвязанной таблицы и поиск доступных данных

Запрос 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 

Запрос 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 

Как вы можете видеть лектора здесь играет две роли, которые supervisor и examiner. В запросе 1 показан запрос для examiner. В запросе 2 показан запрос для supervisor и их учеников.

схема

База данных:

Free:

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

Лектор:

lecturerID (varchar2) 
lecturerFullname (varchar2) 

Наличие:

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

Студент:

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

Прежде всего, я хотел бы присоединиться к этим двум запросам. Поскольку они не связаны. Я пробовал использовать CROSS JOIN, но я получил бесконечность.

Во-вторых, после того, как запрос будет соединен. Я бы хотел, чтобы запрос нашел supervisor ИЛИ examiner, в котором одно из них имеет значение в freedate (например: 10-05-2016). Поскольку большинство из них будет иметь значение NULL в freedate. На него ценят только некоторые лекторы.

Затем он даст результат запроса, где он показывает что-то вроде этого:

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

Например, экзаменатор freedate 10-05-2016. Между тем, руководитель имеет нулевое значение freedate.

Или, может быть, есть эффективный способ?

+0

Непонятно, как данные «соединяются» вместе. Если вы можете добавить некоторые примеры данных, которые соответствуют вашим желаемым результатам, мы сможем понять это лучше. – sstan

ответ

0

что-то вроде

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

Как я могу видеть из таблиц базы данных, все они имеют общий ключ быть соединены.

схема базы данных:

Free:

availableID (номер) lecturerID (varchar2) freedate (Дата)

Лектор:

lecturerID (varchar2) lecturerFullname (varchar2)

Доступность:

availableID (номер) availableDay (varchar2) availableStart (Дата) availableEnd (Дата) // Время availableDate (Дата)

Студент:

studentID (varchar2) studentName (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 

Но, так как вы уже упоминали о том, что две разные, вы можете использовать UNION для того же.

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 

Оператор UNION по умолчанию выбирает только разные значения. Чтобы разрешить повторяющиеся значения, используйте ключевое слово ALL с UNION.

Смежные вопросы