2016-05-09 70 views
0

其他表基本上我有一個查詢,如下所示:加入參考表比基表

SELECT MAIN.response_id AS 'Response Id', 
    CONCAT(CASE 
     WHEN MAIN.months = 'Jan - Mar' THEN 'March' 
     WHEN MAIN.months = 'Apr - Jun' THEN 'June' 
     WHEN MAIN.months = 'Jul - Sep' THEN 'September' 
     WHEN MAIN.months = 'Oct - Dec' THEN 'December' 
     ELSE 'Error' 
    END, ' ', MAIN.Year) AS Period, 
    CNT.country_name AS Country, INITM.num_modules AS 'Initial Training - Number of Modules', INITTRAINED.num_instr AS 'Initial Training - Instructors Trained', INITPASS.pass_num AS 'Initial Training - Instructors Passed', INITPASS.pass_num/INITTRAINED.num_instr AS 'Initial Training - Pass Percentage' 
FROM responses_main AS MAIN -- Main responses table 
LEFT OUTER JOIN responses_init_training_modules AS INITM USING (response_id) -- Main INIT training table 
LEFT OUTER JOIN responses_init_training_pass_num AS INITPASS USING (response_id) -- Main INIT training table 
LEFT OUTER JOIN responses_init_training_instr_trained AS INITTRAINED USING (response_id) -- Main INIT training table 
LEFT OUTER JOIN country AS CNT ON MAIN.country_id = CNT.country_id -- Country table 
GROUP BY MAIN.response_id, MAIN.months + ' ' + MAIN.Year, CNT.country_name 

什麼從該查詢缺少的是一個連接到節目表。每個引用表(INITM,INITPASS和INITTRAINED)都有一個引用程序表的program_id,但是基表(MAIN)與程序表無關。當前查詢的結果是隻返回第一個數據的表格program_id +不顯示任何程序信息。

如何獲取顯示MAIN.response_id,PROG.program_id,INITM.num_modules,INITPASS.pass_num和INITTRAINED.instr_trained的數據集?我無法弄清楚如何使用3個引用表中的數據來獲取一個引用這兩個維度(MAIN和PROG)的表格。

我畫了什麼,我想在這裏實現:

image

任何幫助深表感謝。

+0

不要畫出來。平方米。 – Strawberry

+0

你寫過3個表中有program_id作爲外鍵。這3個表中的哪一個應引用程序表? – Shadow

+0

@shadow其respond_init_training_modules,respond_init_training_pass_num和respond_init_training_instr_trained表。 respond_main表沒有program_id列。 –

回答

0

看起來像你的數據結構造成的困難..我假設你的3 responses_init_*responses_main的子類。

假設一個響應只適用於一個程序,我可能會被所有的program_id欄移動到responses_main表接近這一點,並從那裏:

SELECT ... 
     FROM program p 
     JOIN responses_main rm 
     ON rm.program_id = p.program_id 
LEFT JOIN responses_init_training_modules ritm 
     ON ritm.response_id = rm.response_id 
LEFT JOIN responses_init_training_pass_num ritpn 
     ON ritpn.response_id = rm.response_id 
LEFT JOIN responses_init_training_instr_trained ritit 
     ON ritit.response_id = rm.response_id 
     ... 

注:

  • 我d在表格名稱的單數和複數之間做出決定(responses,program
  • 如果您正在使用宿舍,請將其另存爲TINYINT或將該範圍的開始和結束分別存儲爲TINYINT個月或DATE。將任何種類的範圍存儲爲以連字符分隔的字符串將在以後出現問題。

UPDATE

談談你的DBA,說明你需要什麼,看他是否會改變對你和它的意義。

與此同時,無論是運行三個連接到單獨編程:

LEFT JOIN program ritmp 
     ON ritmp.program_id = ritm.program_id 
LEFT JOIN program ritpnp 
     ON ritpnp.program_id = ritpn.program_id 
LEFT JOIN program rititp 
     ON rititp.program_id = ritit.program_id 

或者你可以使用:

(LEFT) JOIN program p ON p.program_id = COALESCE(ritm.program_id, ritpn.program_id, ritit.program_id) 

但是這將是緩慢的,我會推薦它作爲一個最後一招。

+0

嗨,我很欣賞這種迴應。不幸的是,respond_main表沒有自己的鏈接到程序表。它和程序表一樣鏈接到子表。有任何想法嗎?此外,完全同意你對設計的想法,不幸的是這是由其他人處理 - 我只是從中報告。 –