我的任务是编写一个查询来显示来自我们公司数据库的报告分配。我需要查询三个表:REPORT,其中包含报告的顶级信息,PROCEDURE,每个报告可以包含多个结果的单个报告程序,以及TECHNICIAN,每个程序可以包含多个技术人员,基于谁分配给它。
我的问题是,如果没有技术人员分配到某个程序,它没有为该程序返回任何内容,而理想情况下我希望返回一行,技术人员字段为&#34 ;空"
我目前的代码是:
SELECT
rep.RPT_ID
,tech.TECH_ID
,proc.PROC_ID
FROM REPORT rep
LEFT JOIN TECHNICIAN tech ON tech.RPT_ID = rep.RPT_ID
LEFT JOIN PROCEDURE proc ON proc.RPT_ID = rep.RPT_ID
WHERE rep.LAB_ID in ('test_lab')
AND proc.PROC_ID = tech.PROC_ID
如果没有分配技术,我希望返回这样的内容:
RPT_ID | TECH_ID | PROC_ID
12345 456 1
12345 NULL 2
67890 123 1
67890 345 1
但目前我还没有获得第二排。
答案 0 :(得分:3)
问题是and proc.PROD_ID = tech.PROD_ID
子句中有WHERE
。
你应该把它移到proc的LEFT JOIN
LEFT JOIN PROCEDURE proc ON proc.RPT_ID = rep.RPT_ID and proc.PROD_ID = tech.PROD_ID
以这种方式考虑,如果您的查询,SQL使用连接条件连接表,然后根据where子句过滤结果。
答案 1 :(得分:1)
这是查询。
SELECT
rep.RPT_ID
,tech.TECH_ID
,proc.PROC_ID
FROM REPORT rep
LEFT JOIN TECHNICIAN tech ON tech.RPT_ID = rep.RPT_ID
LEFT JOIN PROCEDURE proc ON proc.RPT_ID = rep.RPT_ID AND proc.PROC_ID = tech.PROC_ID
WHERE rep.LAB_ID in ('test_lab');
答案 2 :(得分:0)
@ Janaki的回答只提供PROCEDURE
行,如果他们有匹配的TECHNICIAN
行。在这种情况下,我认为PROCEDURE
或TECHNICIAN
可能会丢失。我会像这样解决这个问题:
SELECT rep.rpt_id, tp.tech_id, tp.proc_id
FROM report rep
LEFT JOIN
(SELECT COALESCE (tech.rpt_id, proc.rpt_id) AS rpt_id,
tech.tech_id,
proc.proc_id
FROM technician tech
FULL OUTER JOIN procedure proc
ON proc.proc_id = tech.proc_id) tp
ON tp.rpt_id = rep.rpt_id
WHERE rep.lab_id IN ('test_lab')
full outer join
确保涵盖三种方案:仅PROCEDURE
;只有1个}}; TECHNICIAN
和PROCEDURE
。 TECHNICIAN
涵盖了最终方案:无LEFT JOIN
或TECHNICIAN
。
鉴于澄清(见评论),可以简化此查询:
PROCEDURE
首先加入SELECT rep.rpt_id, tech.tech_id, proc.proc_id
FROM report rep
LEFT JOIN procedure proc ON proc.rpt_id = rep.rpt_id
LEFT JOIN technician tech
ON tech.rpt_id = rep.rpt_id AND proc.proc_id = tech.proc_id
WHERE rep.lab_id IN ('test_lab');
加入PROCEDURE
,然后根据前两个表加入TECHNICIAN
非常重要。这允许外连接按照澄清正确指定级联。