0

这里有点不寻常的要求,不幸的是,这归结为一个糟糕的表设计,在开发过程中很长一段路要走!

我有 3 张桌子repairs,,,,stafftechnicians

维修表包含有关在我的系统中预订的维修任务的所有信息。这包含一个“技术人员”字段,该字段将包含工作人员的 ID(来自表工作人员)或外包(异地)技术人员(来自表技术人员)的 ID,在后一种情况下,ID 将具有“T”的前缀

因此,由于后一种情况前缀,我需要能够获取该 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应该可以工作,不是吗?

编辑:我可能应该补充一点,上面的条件连接示例不起作用!

4

1 回答 1

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
于 2012-07-02T12:55:12.197 回答