2016-05-09 34 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表没有自己的链接到程序表。它和程序表一样链接到子表。有任何想法吗?此外,完全同意你对设计的想法,不幸的是这是由其他人处理 - 我只是从中报告。 –