如果在连接表上找不到记录,如何返回null值

时间:2014-05-09 15:50:52

标签: sql sql-server tsql left-join

我的任务是编写一个查询来显示来自我们公司数据库的报告分配。我需要查询三个表: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

但目前我还没有获得第二排。

3 个答案:

答案 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行。在这种情况下,我认为PROCEDURETECHNICIAN可能会丢失。我会像这样解决这个问题:

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个}}; TECHNICIANPROCEDURETECHNICIAN涵盖了最终方案:无LEFT JOINTECHNICIAN


鉴于澄清(见评论),可以简化此查询:

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非常重要。这允许外连接按照澄清正确指定级联。