INNER JOIN 多个列到另一个 table 的同一列

INNER JOIN multiple columns to same column from another table

我得到了 hmmd_prm table 即:

| id |  hmmd_id  |  prm1  |  prm2  |  prm3  |  prm4  |  prm5  |  prm6  |  prm7  |  prm8  |  prm9  |  prm10 |
| 1  |     2     |   1    |   2    |   3    |   1    |   2    |   3    |   1    |   2    |  null  |  null  |
| 2  |     3     |   4    |   3    |   2    |   1    |   4    |   3    |   2    |   1    |   4    |   3    |

lab_prm table 即:

| prm_id |  prm_adi  |  prm_adgr  |  prm_udgr  |  prm_birim  |  prm_ctrl  |
|   1    |    pH     |
|   2    |    O2     |
|   3    | peroxide  |
|   4    |    hum    |

和 main_hmmd table 具有名称并使用 hmmd_id

提取名称

我试图得到这样的结果:

| id |  hmmd_id  |  prm1  |  prm2  |  prm3  |  prm4  |  prm5  |  prm6  |  prm7  |  prm8  |  prm9  |  prm10 |
| 1  |   BUGDAY  |   pH   |   O2   | prxide |   pH   |   O2   | prxide |   pH   |   O2   |  null  |  null  |

我正在使用这样的东西:

SELECT hp.id, mh.hmmd_adi, lp1.prm_adi, lp2.prm_adi, lp3.prm_adi, lp4.prm_adi, lp5.prm_adi, lp6.prm_adi, lp7.prm_adi, lp8.prm_adi, lp9.prm_adi, lp10.prm_adi
FROM std_tbl_hmmd_prm AS hp
INNER JOIN std_tbl_main_hmmd AS mh ON mh.id = hp.hmmd_id
INNER JOIN std_tbl_lab_prm AS lp1 ON hp.prm1 = lp1.prm_id
INNER JOIN std_tbl_lab_prm AS lp2 ON hp.prm2 = lp2.prm_id
INNER JOIN std_tbl_lab_prm AS lp3 ON hp.prm3 = lp3.prm_id
INNER JOIN std_tbl_lab_prm AS lp4 ON hp.prm4 = lp4.prm_id
INNER JOIN std_tbl_lab_prm AS lp5 ON hp.prm5 = lp5.prm_id
INNER JOIN std_tbl_lab_prm AS lp6 ON hp.prm6 = lp6.prm_id
INNER JOIN std_tbl_lab_prm AS lp7 ON hp.prm7 = lp7.prm_id
INNER JOIN std_tbl_lab_prm AS lp8 ON hp.prm8 = lp8.prm_id
INNER JOIN std_tbl_lab_prm AS lp9 ON hp.prm9 = lp9.prm_id
INNER JOIN std_tbl_lab_prm AS lp10 ON hp.prm10 = lp10.prm_id

它如我所愿地工作,但我很确定有更好的解决方案。

我怎样才能使这个更简单?

提前致谢。

更新: 我想要实现的是,在 hmmd_prm table 中我有一些 materials 作为 hmmd_id 并且用户将对这些参数应用一些参数。我为参数创建了 10 列,因此用户最多可以分配 10 个参数,但也可以分配 1 或 2 个参数,其余为空。

这可能不是最好的解决方案,因为这是我第一次做这样的事情,但我只是不希望结果显示为相同 material 的多个条目,每个条目具有不同的参数行如下。

| id |  hmmd_id  |  prms  |
| 1  |     2     |   1    |
| 2  |     2     |   2    |
| 3  |     2     |   3    |
| 4  |     2     |   1    |
| 5  |     2     |   2    |
| 6  |     2     |   3    |
| 7  |     2     |   1    |

您可以规范化 hmmd_prm,使其成为相交的 table(多对多)。您没有提供足够的数据信息来了解这是否可行。如果 prm1、prm2 等有任何意义,您可能还需要一个值为 1 到 10 的位置列。

| Id | hmmd_id | prm_id | prm_position |
| 1  | 2       | 1      | 1            |
| 1  | 2       | 1      | 2            |
| 1  | 2       | 1      | 3            |
| 1  | 2       | 1      | 4            |

等等

然后您可以在 hmmd_id、prm_id 和 prm_position 之间创建唯一约束以确保完整性。

SQL 和关系数据库是同一枚硬币的两面,它们都在设计中融入了规范化数据结构。

这只是一个迹象,表明您处理的结构不适合 SQL,因此也不适合关系数据库。 (代码味道。)

因此,一些 重复可以通过动态规范化结构来删除,然后如果你 必须再次去规范化.

SELECT
  hp.id,
  mh.hmmd_adi,
  MAX(CASE WHEN pivot_prm.col_id =  1 THEN lp.prm_adi END)   AS prm1,
  MAX(CASE WHEN pivot_prm.col_id =  2 THEN lp.prm_adi END)   AS prm2,
  MAX(CASE WHEN pivot_prm.col_id =  3 THEN lp.prm_adi END)   AS prm3,
  MAX(CASE WHEN pivot_prm.col_id =  4 THEN lp.prm_adi END)   AS prm4,
  MAX(CASE WHEN pivot_prm.col_id =  5 THEN lp.prm_adi END)   AS prm5,
  MAX(CASE WHEN pivot_prm.col_id =  6 THEN lp.prm_adi END)   AS prm6,
  MAX(CASE WHEN pivot_prm.col_id =  7 THEN lp.prm_adi END)   AS prm7,
  MAX(CASE WHEN pivot_prm.col_id =  8 THEN lp.prm_adi END)   AS prm8,
  MAX(CASE WHEN pivot_prm.col_id =  9 THEN lp.prm_adi END)   AS prm9,
  MAX(CASE WHEN pivot_prm.col_id = 10 THEN lp.prm_adi END)   AS prm10
FROM
  std_tbl_hmmd_prm   AS hp
INNER JOIN
  std_tbl_main_hmmd  AS mh
    ON mh.id = hp.hmmd_id
CROSS APPLY
(
  VALUES
    ( 1, hp.prm1 ),
    ( 2, hp.prm2 ),
    ( 3, hp.prm3 ),
    ( 4, hp.prm4 ),
    ( 5, hp.prm5 ),
    ( 6, hp.prm6 ),
    ( 7, hp.prm7 ),
    ( 8, hp.prm8 ),
    ( 9, hp.prm9 ),
    (10, hp.prm10)
)
  AS pivot_prm(col_id, prm_id)
INNER JOIN
  std_tbl_lab_prm   AS lp
    ON pivot_prm.prm_id = lp.prm_id
GROUP BY
  hp.id,
  mh.hmmd_adi

我个人建议 不要 执行 GROUP BYMAX(CASE) 来使结果去规范化,而只是使用...

SELECT
  hp.id,
  mh.hmmd_adi,
  pivot_prm.col_id,
  lp.prm_adi
FROM
  std_tbl_hmmd_prm   AS hp
INNER JOIN
  std_tbl_main_hmmd  AS mh
    ON mh.id = hp.hmmd_id
CROSS APPLY
(
  VALUES
    ( 1, hp.prm1 ),
    ( 2, hp.prm2 ),
    ( 3, hp.prm3 ),
    ( 4, hp.prm4 ),
    ( 5, hp.prm5 ),
    ( 6, hp.prm6 ),
    ( 7, hp.prm7 ),
    ( 8, hp.prm8 ),
    ( 9, hp.prm9 ),
    (10, hp.prm10)
)
  AS pivot_prm(col_id, prm_id)
INNER JOIN
  std_tbl_lab_prm   AS lp
    ON pivot_prm.prm_id = lp.prm_id

这将使许多后续查询变得更加简单。