2

説明するのは難しいですが、私はこの表を持っています。3 つの列 (no、patient_no、procedure_no) がある Incredcharges です。「no」列は無視してください。必要なもう 1 つのテーブルは料金で、プロシージャの名前が格納されます。したがって、対応するプロシージャ名でprocedure_noを出力したいと思います。

問題は、「料金」だけが必要なテーブルではないことです。あまりにも愚かだったので、ER チャージ、超音波、および監禁の手順名を分けました。したがって、同じ構造を持つ 3 つのテーブルを生成します。

    SELECT incurredcharges.procedure_no, incurredcharges.patient_no, charges.procedure
    FROM incurredcharges

    INNER JOIN charges
ON incurredcharges.procedure_no=charges.procedure_no
    WHERE incurredcharges.patient_no=12;

そのステートメントは機能しますが、ER料金のみからのプロシージャ名のみが表示されます。超音波と閉じ込め手順の名前は表示されません!

4

1 に答える 1

2

すぐに必要な場合はUNION ALL、3 つのテーブルをまとめて派生テーブルとして使用できますJOIN

SELECT
  `c`.`procedure`, 
  `incurredcharges`.`procedure_no`,
  `incurredcharges`.`patient_no`
FROM
  incurredcharges
  /* UNION ALL the 3 like tables together as a derived table */
  INNER JOIN (
    SELECT `procedure`, `procedure_no` FROM `charges`
    UNION ALL
    SELECT `procedure`, `procedure_no` FROM `confinement`
    UNION ALL
    SELECT `procedure`, `procedure_no` FROM `ultrasound`
  ) c ON `incurredcharges`.`procedure_no` = c.`procedure_no`
WHERE `incurredcharges`.`patient_no` = 12

しかし、将来のために:

ただし、正しい長期的な解決UNION ALL策は、サブクエリで使用されているのと同様の構造を使用して、これらすべてのレコードを統合テーブルに挿入し、ソースを識別する新しい列を使用することです。

CREATE TABLE unified_charges AS 
  SELECT `procedure`, `procedure_no`, 'ER' AS `chargetype` FROM `charges`
  UNION ALL
  SELECT `procedure`, `procedure_no`, 'CONFINEMENT' AS `chargetype` FROM `confinement`
  UNION ALL
  SELECT `procedure`, `procedure_no`, 'ULTRASOUND' AS `chargetype` FROM `ultrasound`

注:procedureは、バッククォートで引用する必要がある MySQL の予約済みキーワードであるため、すべてを引用しました。

于 2012-12-16T16:51:43.237 に答える