2012-03-18 2 views
3

クエリに参加する - 私は(以下に示すように)私は4つのテーブルを持っている私はもともと4つの別々のクエリを介してこれをやっていた

...それは私が加入を使用して私のコードを最適化する時だと思う:

 
[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.professor_id - >sl_project_course.project_id - 私はsl_projectsl_student_course.course_id = sl_project_course.course_idsl_professorからすべてのデータを必要とし、その後、私はsl_project_course

SO ...

sl_student_course.course_idからproject_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

はい、courseNameとproject_idが一致するprojectName、professorName、professorEmailが必要です。 –

答えて

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.クエリーでLATERを後で宣言する場合、「P」と「F」がどのようなものか知っていますか? 2.なぜ「内部」結合と「自然」結合を使用していますか? 3.このクエリでは「@」記号は/ doを表していますか? –

+0

[ナチュラルジョイン](http://en.wikipedia.org/wiki/Join_(SQL)#Natural_join)は、同じ名前を持つすべてのカラムの値を比較しますが、これは推奨されません。結合列を明示的にする方がよい。クエリは、私がFROM/JOINでエイリアシングしているため、PとFが何であるかを知っています。SQLは、クエリの後半で「宣言された」ものが何であるかを把握するのに十分なほどスマートです。 – Bort

+0

うわー、それはかなり印象的です - SQLは思ったよりスマートです!私は "@"記号がパラメータクエリを表していると読んでいますが、そうであればどこかでパラメータに値を与える必要はありませんか?私は、クエリーが「@project_id」と言ったときに、それがとてもスマートなので、私たちが 'sl_project'を参照していることを知っていると仮定していますか? –

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 

自然が参加し、それが設定より規約を好むので、いいです - ので、あなたが期待される方法であなたのDB設計をすれば、あなたの安全な努力。

更新:*特定のフィールドが必要です。

+0

それでは、sl_stduent_courseのすべてのフィールドを選択してもらえませんか? –

+1

@エヴァン:ジョインはジョインの両側からすべてのフィールドを返すので、j13rのクエリは4つのテーブルすべてからすべてのフィールドを返します。 (リレーショナル代数は、結合の片側からのみフィールドを取得する「セミ・ジョイン」と「アンチ・ジョイン」の概念を持っていますが、SQLはそれらを直接サポートしていません) ';私は明示的に結合条件を指定する方が良いと思います。 – ruakh

+0

だから、ruakh、あなたは何をしますか?内部結合? –

関連する問題