2015-11-30 109 views
2

我做一個Postgres數據庫的Java應用程序和以下模式:查詢發現項目沒有領袖

enter image description here

實體employeerolproject裏面有一些信息,與實體參與者是空的。我想在我的應用程序中顯示一個尚未分配領導者的所有項目表。我敢肯定,有可能與SQL查詢,但我不知道如何。我試過這個查詢:

SELECT p.projectnumber from participants pa, projecto p 
where p.projectnumber=pa.projectnumber and pa.leaderid IS NULL; 

但是沒有行返回。這是因爲參與者實體是空的,但我無法僅填充項目編號。你認爲我可以通過查詢或任何其他建議來簡化它嗎?

回答

1

我想在我的應用程序顯示一個表格,顯示所有不帶項目負責人還指派

猜測領導人通過在participants.leaderid一個非空值所指:

SELECT projectnumber 
FROM projecto p 
WHERE NOT EXISTS (
    SELECT 1 
    FROM participants 
    WHERE projectnumber = p.projectnumber 
    AND leaderid IS NOT NULL 
    ); 

您可以用LEFT JOIN以及解決它,但後來包括在連接條件的leaderid

SELECT p.projectnumber 
FROM projecto p 
LEFT JOIN participants pa ON pa.projectnumber = p.projectnumber 
          AND pa.leaderid IS NOT NULL 
WHERE pa.projectnumber IS NULL; 

WHERE條件對leaderid支票(LEFT JOIN)不能區分是否列leaderid在基礎表中爲NULL,或者因爲在participants中根本沒有連接的行。在這個特定的查詢中,結果仍然是正確的(沒有參與者,沒有領導者)。但是,它會爲每個不是領導者的參與者返回一行,並且我希望您只想列出每個領導者少的項目。你將不得不彙總,但爲什麼要加入到多個非領導人開始?

基礎:

這且不說,你的關係設計似乎沒有加起來。什麼是阻止同一個項目的多個領導者?爲什麼varchar(30)用於大多數列?爲什麼在participantproject之間沒有FK約束?爲什麼projecto在查詢中,但project在ER圖中?等

+0

哇只是我需要的,非常感謝你:) –

+0

以及我必須設計的問題告訴我,一名員工可以在一個或多個項目,所以我認爲他可以許多項目的領導者。我會考慮你所有的問題,但我只能告訴你,我開始學習數據庫的基礎知識,所以在這個問題上我仍然是一個新手。我仍然有一條很長的路要學習:D –

+0

@DanielEstebanLadinoTorres:一個項目可以有許多員工(作爲參與者),一個員工可以參與許多項目。看起來像一個典型的多對多關係。所起的作用可以被認爲是一個附加屬性(簡化)。這裏的說明:http://stackoverflow.com/a/9790225/939860 –

1

您可以使用LEFT JOIN假設其沒有在參與者表項的項目將是沒有領導者:

SELECT p.projectnumber 
FROM projecto p LEFT JOIN participants pa 
ON p.projectnumber=pa.projectnumber 
WHERE pa.leaderid IS NULL; 
+0

感謝仍然有益於未來的參考 –