将3个表合并为一个,然后使用join语句

时间:2012-12-16 16:45:29

标签: mysql sql

很难解释但我有这个表,在有3列的情况下会产生费用(no,patient_no,procedure_no)忽略“no”列。我需要的另一个表是收费,其中存储了程序的名称。所以我想输出procedure_no及其相应的过程名称。

问题是,“收费”不是我需要的唯一表格。因为我是如此愚蠢,我分离了ER充电,超声波和限制的程序名称。因此生成具有相同结构的三个表。

    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费用。超声和限制程序名称将不会显示!

1 个答案:

答案 0 :(得分:2)

对于迫切需要,您可以将3个表格UNION ALL作为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必须使用反引号引用a MySQL reserved keyword,所以我只引用了所有内容。