2014-01-27 53 views
2

我已經有MySQL DB,我嘗試獲取與給定項目編號的'ProjectId'或'ProjectScopeChangeID'有關的所有'Job'條目。有些項目有ProjectScopeChange,有些則沒有。SQL連接3個表格,其中一個是可選的

這對我來說是3個表格的不尋常關係,我嘗試了各種連接組合之後已經丟失了。這是問題的一部分的模式: the problem part

數據在ProjectScopeChange表是這樣的:

projectScopeChanngeID project 
2      4 
4      4 

PlannedDisciplineJob表是這樣的:

plannedDisciplineJobID projectID projectScopeChangeID 
1      4    {null} 
2      4    {null} 
14      4    {null} 
4      {null}   2 

而且由於項目 - PSC是一個項目沒有關於PSC的任何專欄。

基本上,如果我想只得到所有作業的項目,我會使用此代碼:

select p.projectID, 
pdj.plannedDisciplineJobID 

from project p, 
planneddisciplinejob pdj 

where p.projectID = pdj.projectID 
    and p.number = ? 

另外,如果我想爲所有作業的一個PSC,我使用方法:

select p.projectID, 
psc.projectScopeChangeID, 
pdj.plannedDisciplineJobID 

from project p, 
projectscopechange psc, 
planneddisciplinejob pdj 

where pdj.projectScopeChangeID = psc.projectScopeChangeID 
    and p.projectID = psc.project 
    and p.number = ? 

,但是,當我試圖把它一起在某種程度上是這樣的:

select p.projectID, 
psc.projectScopeChangeID, 
pdj.plannedDisciplineJobID 

from project p 
left join projectscopechange psc 
on p.projectID = psc.project, 
planneddisciplinejob pdj 

where p.number = ? 
    and (pdj.projectID = p.projectID 
    or pdj.projectScopeChangeID = psc.projectScopeChangeID) 

它只是導致組合

projectID projectScopeChangeID plannedDisciplineJobID 
4   2      1 
4   2      2 
4   2      4 
4   2      14 
4   4      1 
4   4      2 
4   4      14 

,而不是預期的(4專案編號4的PSC,但沒有工作)

projectID projectScopeChangeID plannedDisciplineJobID 
4   {null}     1 
4   {null}     2 
4   {null}     14 
4   2      4 

預先感謝您的任何暗示導致正確的結果

+0

那麼,我最終通過在前2條select語句中使用UNION得到了結果(並且修改的select列只能來自PDJ表),但在我看來,這並不是一種正確的做法。我仍然認爲它是正確的JOIN挑戰,所以我仍然想知道如何僅使用JOIN(沒有UNION)。它甚至有可能嗎? – Kuba

回答

0

試試這個:

SELECT p.projectID, psc.projectScopeChangeID, pdj.plannedDisciplineJobID 
FROM project p 
INNER JOIN planneddisciplinejob pdj ON pdj.projectID = p.projectID 
LEFT JOIN projectscopechange psc ON pdj.projectScopeChangeID = psc.projectScopeChangeID 
WHERE p.number = ? 
+0

謝謝Saharsh,但是這給了我同樣的結果,就像只加載項目時一樣(除了projectScopeChangeID列爲null) - 恰好只是預期結果的前3行 – Kuba

+0

抱歉Saharsh,忘了它。現在它在那裏。基本上,PDJ有ID爲項目或Psc,其他爲空 – Kuba

+0

那麼,你的建議不幸沒有奏效。因爲實際的最終查詢比這個例子更復雜一些,並且使用了更多的表連接,所以使用UNION時唯一的問題是畢竟所有的東西都必須被寫兩次,包括參數。但這是一個小問題; o) – Kuba