0

ここでの少し珍しい要件ですが、残念ながら、開発パスのずっと前のテーブルデザインが貧弱でした。

私は3つのテーブルを持っていますrepairs、、、stafftechnicians

修復テーブルには、システムに予約されている修復タスクに関するすべての情報が含まれています。これには「技術者」というフィールドが含まれます。このフィールドには、スタッフ(テーブルスタッフから)のIDまたは外部委託(オフサイト)技術者(テーブル技術者から)のIDが含まれます。後者の場合、IDには「T」のプレフィックス

staffしたがって、この後者の場合のプレフィックスのために、そのTを取得し、それを使用して、SQLクエリがテーブルまたはテーブルを結合する必要があるかどうかを判断できる必要があります。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」プレフィックスを克服します。

しかし...

テーブルに参加しようとすると、IDが混同されstaffます。

したがって、次のような条件付き結合が必要です。

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

ここで確認できるもう1つの問題は、テーブルにtechnicans.screenName参加していない場合、フィールドリストに含まれているフィールドが機能しないことですtechnicians。ただし、テーブルには、そのテーブルに参加した場合に必要なstaffフィールドが含まれているため、テーブルプレフィックスのないscreenNameあいまいなフィールド名screenNameは機能するはずですよね?

編集:上記の条件付き結合の例は機能しないことを追加する必要があります!

4

1 に答える 1

1

包含/除外条件を使用して両方のテーブルを結合し、INSTRnull以外の値を表示することができます。

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 に答える