2014-05-09 61 views
1

我一直負責編寫查詢以顯示來自公司數據庫的報告分配。我需要查詢三個表格:REPORT,其中包含報告的頂級信息PROCEDURE,其中可以包含每個報告關於各個報告程序的多個結果,以及TECHNICIAN,每個程序可以包含多名技術人員,基於誰被分配給它。如何在連接表上找不到記錄時返回空值

我的問題是,如果沒有技術人員分配到一個過程,它沒有返回任何該過程,而理想情況下,我希望它返回一行技術員字段爲「空」。

當前的代碼我是這樣的:

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 

,但目前我沒有得到這第二排。

+2

'AND proc.PROC_ID = tech.PROC_ID'我猜這個問題是在這種情況下 – potashin

+0

在加入'PROCEDURE'之前'TECHNICIAN' – fnightangel

回答

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'); 
+0

不會是第二個左邊需要是完整的外層以確保你不需要丟失程序(保留空值)? – xQbert

+0

謝謝,這個給了我我需要的結果。我不太清楚JOIN語句如何工作。 – user3620886

+0

此解決方案不會返回具有關聯'PROCEDURE'的REPORT'記錄,但不會返回關聯的'TECHNICIAN'。 – Allan

3

問題是你在WHERE條款中有and proc.PROD_ID = tech.PROD_ID

你應該進入PROC的LEFT JOIN

LEFT JOIN PROCEDURE proc ON proc.RPT_ID = rep.RPT_ID and proc.PROD_ID = tech.PROD_ID

它這樣的想法,如果你的查詢時,SQL使用連接標準連接表,然後篩選基礎上,在結果條款。

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;只有TECHNICIAN; PROCEDURETECHNICIANLEFT JOIN涵蓋了最終方案:沒有TECHNICIANPROCEDURE


給出的說明(見註釋),這個查詢可以簡化爲:

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是很重要的。這允許外連接按照澄清規定進行級聯。

+0

在這種情況下,每個REPORT將始終至少有一個與之關聯的PROCEDURE,但每個PROCEDURE不一定具有TECHNICIANS。 – user3620886

相關問題