2014-11-14 59 views
0

我想在數據庫中設置一個視圖我想從PROGRAM表中查看PERSON表中的所有數據和NON_PERSONNEL表中的三列。這是我現在正在嘗試,查詢運行沒有錯誤,但不給我任何結果。下面列出的表中的所有4勢在必行推導出答案在鏈接SQL中的多個表時查看來自兩個表的數據

SELECT 
    person.*, 
    non_personnel.description, 
    non_personnel.amount 
FROM 
    person, 
    non_personnel, 
    personnel_role, 
    programs 
WHERE 
    person.person_id = personnel_role.person_id 
    AND personnel_role.program_id = programs.program_id 
    AND programs.program_id = non_personnel.program_id 
    AND programs.program_name = 'Fake Program' 
+2

在其他桌子上使用'Left Join'與人員表,@RADAR答案應該適合你 – 2014-11-14 19:59:18

+0

[踢壞的習慣:使用舊式JOIN](http://sqlblog.com/blogs/aaron_bertrand/archive/) 2009/10/08/bad-habits-to-kick-using-old-style-joins.aspx) - 舊式*逗號分隔的表*樣式列表被替換爲* proper * ANSI'JOIN'語法在ANSI - ** 92 ** SQL標準中(**超過20年**之前),其使用是不鼓勵的 – 2014-11-14 20:18:16

回答

0

這實際上取決於您的模式和表中的數據。您現在編寫的方式意味着只有每個表中匹配的記錄(根據您的WHERE條件)纔會傳遞到結果集中。

這意味着您必須將programs表中的所有program_id's表中的所有program_id's表返回到您的non_personnel表中的結果中。他們也必須全部在您的personnel_role表格中。並且您的personnel_role表中的所有person_ids表必須位於person表中。你沒有結果,所以這可能不是你想要寫的。

我的猜測是你想在這裏使用LEFT OUTER JOINLEFT OUTER JOIN說:「從一個表中取出所有記錄,並從ON表中取出滿足ON語句中條件的記錄」。

因爲你是基於特定的程序想要的信息,機會是你要開始與該表:

SELECT person.*, 
    non_personnel.description, 
    non_personnel.amount 
FROM 
    programs 
    LEFT OUTER JOIN personnel_role ON 
     programs.program_id = personnel_role.program_id 
    LEFT OUTER JOIN person ON 
     personnel_role.person_id = person.person_id 
    LEFT OUTER JOIN non_personnel 
     programs.program_id = non_personnel.program_id 
WHERE 
    programs.program_name = 'Fake Program' 

這是一個有點假設的,因爲我不知道你的模式是什麼,或者怎麼樣你的數據是建立的,但我打賭這是你以後的。

這是什麼FROM條款說的是: 1.將所有記錄Program(其中program_name =「假方案」),並只reocrds從personnel_role共享同一program_id 2. person其中person_id只拿記錄匹配我們剛剛從personnel_role表中獲得的記錄 3.僅取自non_personnel的記錄,其中它與program表中的結果共享program_id。

2

你需要使用left join,所以你得到所有的人,但描述和量可以爲NULL,如果這個人沒有其他表

記錄

也使用顯式連接語法。

SELECT person.*, non_personnel.description, non_personnel.amount 
FROM person 
left join personnel_role 
ON person.person_id = personnel_role.person_id 
left join programs 
ON personnel_role.program_id = programs.program_id 
AND programs.program_name = 'Fake Program' 
left join non_personnel 
ON programs.program_id = non_personnel.program_id