2013-05-10 88 views
1

我必須從兩個表進行查詢,因此,例如這裏是我的表結構爲「學生」表:多個SQL JOIN語句

------------------------------------------- 
id | Name | mom_job_id | dad_job_id 
------------------------------------------- 
1 | Test1 | 1   | 2 
2 | Test2 | 3   | 1 
------------------------------------------- 

,我有「工作」表是這樣的:

--------------------------- 
id | job_name 
--------------------------- 
1 | designer 
2 | writer 
3 | programmer 
--------------------------- 

我要選擇對學生的表中的記錄,並與JOB_NAME更換「工作表」

我已經試過此查詢「mom_job_id」和「dad_job_id」:

SELECT student.id, job.job_name as mom_job, job.job_name as dad_job 
FROM student 
INNER JOIN job ON mom_job_id = job.id 
WHERE id=1 

該查詢做工精細,但爸爸的工作被設置爲相同的媽媽的工作,所以我再添INNER JOIN,使查詢,像這樣:

SELECT student.id, job.job_name as mom_job, job.job_name as dad_job 
FROM student 
INNER JOIN job ON mom_job_id = job.id 
INNER JOIN job ON dad_job_id = job.id 
WHERE id=1 

的查詢工作,但沒有返回任何記錄。那麼我該如何解決這個問題?我相信問題來自job.id

+0

你怎麼沒有得到一個模棱兩可你的where子句出現列錯誤? – RandomUs1r 2013-05-10 15:28:10

回答

2

你已經接近這個了,每次加入時只給一個工作表一個別名。

SELECT s.id, job_mom.job_name as mom_job, job_dad.job_name as dad_job 
FROM student s 
INNER JOIN job job_mom ON s.mom_job_id = job_mom.id 
INNER JOIN job job_dad ON s.dad_job_id = job_dad.id 
WHERE s.id=1 

在作業表的連接不返回行,你仍然要出示學生表中的數據,可以使用LEFT事件JOIN:

SELECT s.id, job_mom.job_name as mom_job, job_dad.job_name as dad_job 
FROM student s 
LEFT JOIN job job_mom ON s.mom_job_id = job_mom.id 
LEFT JOIN job job_dad ON s.dad_job_id = job_dad.id 
WHERE s.id=1 
+0

+1。 。我喜歡你桌上的別名。 – 2013-05-10 15:31:42

+0

謝謝@JoachimIsaksson。編輯。 – Aaron 2013-05-10 15:31:50

+0

@ BryceAtNetwork23完美地工作,但是當學生表上的dad_job或mom_job未在作業表中列出時,它不會返回任何記錄。我應該使用另一個連接嗎? – 2013-05-10 16:01:07

2

因爲您引用了兩次,所以您需要別名作業表。

使用LEFT OUTER JOIN將始終爲學生表中的每個匹配記錄拉一行。如果作業表中沒有匹配的記錄,那麼該列將返回NULL的值。

SELECT s.id, mom.job_name as mom_job, dad.job_name as dad_job 
FROM student s 
    LEFT OUTER JOIN job mom ON s.mom_job_id = mom.id 
    LEFT OUTER JOIN job dad ON s.dad_job_id = dad.id 
WHERE s.id = 1