2012-03-18 4 views
3

я первоначально делал это через четыре отдельных запросов - Я думаю, что пришло время оптимизировать свой код за счет использования присоединяется ...Сложное присоединиться запрос

У меня есть четыре таблицы (как показано ниже):

 
[sl_student_course] 
student_id (int 11) 
------------------ 
course_id (int 11) 
------------------ 

[sl_project_course] 
project_id(int 11) 
------------------ 
course_id (int 11) 
------------------ 

[sl_project] 
project_id (int 11) - Primary Key - 
_____________________ 
professor_id (int 11) 
--------------------- 
project_name (varchar 50) 

[sl_professor] 
professor_id(int 11) - Primary Key - 
_____________________ 
professor_name (varchar 50) 
--------------------- 
project_email (varchar 50) 


Какая информация мне нужна?

мне нужны все данные sl_project и sl_professor где sl_student_course.course_id = sl_project_course.course_id И тогда мне нужно использовать project_id от sl_project_course

SO ...

sl_student_course.course_id ->sl_project_course.project_id ->sl_project.professor_id , sl_project.project_name, ->sl_professor.professor_name, sl_professor.professor_name

Это имеет смысл?

  • Если это не так, вот еще один пример!
 
sl_student_course 
course_id | 1 

sl_project_course 
project_id | 1 
course_id | 1 

sl_project 
project_id | 1 
professor_id | 2 
project_name | project1 

sl_professor 
professor_id | 2 
professor_name | John Doe 
professor_email | [email protected] 

+0

Вы хотите всю эту информацию для данного проекта ID? – Bort

+0

Да, я хочу projectName, ProfessorName, ProfessorEmail, где match_id и project_id совпадают. –

ответ

4

Надеюсь, я правильно понял ваши отношения с таблицами, в которых профессора присоединились к проектам (в таблице sl_project).

Это поможет вам спроектировать и профессор данных (с использованием TSQL):

SELECT P.project_name, F.professor_name, F.professor_email 
FROM sl_project P 
    INNER JOIN sl_professor F ON F.professor_id = P.professor_id 

    -- Not sure where course is coming into play, since you aren't selecting 
    -- anything from the students/course table, but if you need to ensure there is a 
    -- course for this project and students in the course, these joins are necessary. 
    INNER JOIN sl_project_course C ON C.project_id = P.project_id 
    INNER JOIN sl_student_course S ON S.course_id = C.course_id 
WHERE P.project_id = @project_id 
+0

Хорошо, у меня есть несколько вопросов ... 1. Как запрос знает, что такое «P» и «F», если вы объявляете их LATER в запросе? 2. Почему вы используете «внутреннее» соединение против «естественного» соединения? 3. Что означает знак «@» в этом запросе? –

+0

[естественное соединение] (http://en.wikipedia.org/wiki/Join_ (SQL) #Natural_join) сравнивает значения любых и всех столбцов, которые имеют одно и то же имя, что не рекомендуется. Лучше сделать столбцы объединения ясными. Запрос знает, что такое P и F, потому что я сглаживаю их в FROM/JOIN.SQL достаточно умен, чтобы понять, что, даже если они «объявлены» позже в запросе. – Bort

+0

Вау, это очень впечатляет - sql умнее, чем я думал! Я прочитал, что символ «@» представляет собой запрос параметра, однако, если бы это было так, вам не нужно было указывать параметр где-нибудь? Я предполагаю, что запрос знает, что мы ссылаемся на 'sl_project', когда говорим« @project_id », потому что он снова настолько умный? –

1

Попробуйте что-то вдоль этих линий:

select sl_project.project_name, sl_professor.professor_name, sl_professor.professor_email 
from sl_student_course 
natural join sl_project_course 
natural join sl_project 
natural join sl_professor 

естественное соединение хорошо, потому что он предпочитает соглашение по конфигурации - так что если вы ваш дизайн дб ожидаемым образом, вы в безопасности, усилия ,

Обновление: заменено * по заданным полям.

+0

Не так ли просто выбрать все поля из sl_stduent_course? –

+1

@Evan: объединение возвращает все поля с обеих сторон соединения, поэтому запрос j13r возвращает все поля из всех четырех таблиц. (Реляционная алгебра имеет понятия «полу-объединения» и «анти-объединения», которые получают поля только с одной стороны соединения, но SQL не поддерживает их напрямую.) Тем не менее, я действительно не рекомендую «естественное соединение» '; Я думаю, что лучше явно указать условие соединения. – ruakh

+0

Итак, руах, что бы вы сделали? Внутреннее соединение? –

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