2

很难解释,但我有这张表,它有 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 费用的过程名称。不会显示超声和分娩程序名称!

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 回答