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 BY
和 MAX(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
这将使许多后续查询变得更加简单。
我得到了 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 BY
和 MAX(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
这将使许多后续查询变得更加简单。