条件JOIN根据主表字段的INSTR确定表

时间:2012-07-02 11:15:50

标签: mysql join conditional

这里略有不同寻常的要求,不幸的是,这是一个糟糕的桌面设计,很长一段时间回到了发展道路上!

我有3个表,repairsstafftechnicians

维修表包含有关在我的系统中预订的维修任务的所有信息。这包含一个字段"技术人员"此字段将包含工作人员(来自表格工作人员)或外包(非现场)技术人员(来自表格技术人员)的ID,在后一种情况下,ID将具有" T& #34;

因此,由于后一种情况的前缀,我需要能够获取该T并使用它来确定我的SQL查询是否需要JOIN表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

这将工作正常,并克服了" T"我拥有外包技术人员的所有情况的前缀。

但是...

如果我尝试加入staff表格,则ID会混淆。

所以我需要一个条件连接,例如:

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

我在这里可以看到的另一个问题是,如果我没有加入technicans.screenName表格,那么字段列表中包含的字段technicians将无法正常运行staff表格包含我加入该表时我需要的字段screenName,如果我有一个不明确的字段名称screenName而没有表格前缀应该不应该工作吗?

编辑:我应该补充说上面的条件连接示例不起作用!

1 个答案:

答案 0 :(得分: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