2012-07-02 48 views
0

這裏有一點不尋常的要求,不幸的是,這是一個糟糕的表格設計,很長一段路要走回發展道路!有條件連接根據主表字段的INSTR來確定表格

我有3個表,repairsstafftechnicians

的修繕表包含在登記到我的系統修復任務的所有信息。這包含一個「技術員」字段,該字段將包含工作人員(來自桌面工作人員)或外包(異地)技術員的ID(來自桌面技術人員)的ID,在後一種情況下,ID將具有「T」

所以,前綴由於後一種情況下前綴,我需要能夠抓住T和用它來確定我的SQL查詢是否需要加入表staff或表technicians

所以,我有一個相當簡單的SQL查詢:

SELECT technicians.screenName, 

    repairs.turnAround, repairs.technician, repairs.dateIn, repairs.Type, 
    invoices.status, invoices.grossTotal 

    FROM repairs 
    LEFT JOIN invoices ON repairs.invNo=invoices.id 
    LEFT JOIN technicians ON technicians.id = REPLACE(repairs.technician, 'T','') 

WHERE repairs.id ='REQUIRED JOB ID' ORDER BY repairs.dateIn DESC 

這將工作正常,並克服所有cas的「T」前綴我有一個外包技術人員。

但是...

的ID將混合起來,如果我嘗試加入staff表。

所以我需要一個條件加入其中,比如:

LEFT JOIN 
     WHEN instr(repairs.technican,'T') > 0 THEN 
      JOIN TECHNICIANS TABLE 
     ELSE 
      JOIN STAFF TABLE 
     END 

進一步的問題,我可以在這裏看到的是,現場technicans.screenName被列入字段列表,如果我不加入technicians表將無法正常工作,但是,因爲staff表包含一個字段screenName,如果我加入該表,如果我有一個不明確的字段名稱screenName而沒有表前綴,它應該工作不應該嗎?

編輯:我應該補充一點,上面的條件連接示例不起作用!

+0

抱歉地說,但你可以請把DB模式上http://sqlfiddle.com –

回答

1

您可以加入兩個表與包括/排除INSTR狀態,並顯示不爲空值,則:

SELECT COALESCE(technicians.screenName, staff.screenName) AS screenName, 

repairs.turnAround, repairs.technician, repairs.dateIn, repairs.Type, 
invoices.status, invoices.grossTotal 

FROM repairs 
LEFT JOIN invoices ON repairs.invNo=invoices.id 
LEFT JOIN technicians ON instr(repairs.technican,'T') > 0 AND technicians.id = REPLACE(repairs.technician, 'T','') 
LEFT JOIN staff ON instr(repairs.technican,'T') = 0 AND staff.id = repairs.technician 

WHERE repairs.id ='REQUIRED JOB ID' ORDER BY repairs.dateIn DESC 
+0

完美!謝謝 :-) –