Sql 内部将多个列从另一个表连接到同一列

Sql 内部将多个列从另一个表连接到同一列,sql,sql-server,inner-join,Sql,Sql Server,Inner Join,我得到了hmmd\u prm表,即: | 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

我得到了
hmmd\u prm
表,即:

| 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    |
| prm_id |  prm_adi  |  prm_adgr  |  prm_udgr  |  prm_birim  |  prm_ctrl  |
|   1    |    pH     |
|   2    |    O2     |
|   3    | peroxide  |
|   4    |    hum    |
lab_prm
表格,即:

| 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    |
| prm_id |  prm_adi  |  prm_adgr  |  prm_udgr  |  prm_birim  |  prm_ctrl  |
|   1    |    pH     |
|   2    |    O2     |
|   3    | peroxide  |
|   4    |    hum    |
和main_hmmd表,该表具有名称并使用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
我用的是这样的东西:

| 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表中,我有一些材料,如
hmmd_id
,用户将对这些参数应用一些参数。我为参数设置了10列,这样用户最多可以分配10个参数,但也可以分配1或2个参数,其余为null

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

| 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,使其成为一个相交表(多对多)。您没有提供足够的数据信息,无法知道这是否可行。如果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_位置之间创建一个唯一的约束,以确保完整性。

您可以规范化hmmd_prm,使其成为一个相交表(多对多)。您没有提供足够的数据信息,无法知道这是否可行。如果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_位置之间创建一个唯一的约束,以确保完整性。

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

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

因此,可以通过动态对结构进行正常化来消除某些重复,如果必须执行操作,则可以再次取消正常化

就我个人而言,我建议不要执行
分组方法
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

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

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

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

因此,可以通过动态对结构进行正常化来消除某些重复,如果必须执行操作,则可以再次取消正常化

就我个人而言,我建议不要执行
分组方法
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

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

这对我来说更多的是一种评论而不是回答。这就是在电话中回答问题的原因。。。创建一个好的例子是相当困难的。是的,我通常也通过电话回答。是。。。laborious@Andrew那么你承认打电话回答这个问题了?好主意。实际上我不确定我使用的结构是否适用于此,因为我以前从未做过类似的事情。我更新了关于我想要达到的目标的问题。为了“回答的问题”,我将选择@MatBailie的答案,因为这是对实际问题“我如何能使这个更简单?”的回答。我问这个问题仅仅是因为这个问题让我感觉很糟糕,因为它是重复的,我感觉做了错事。不过,我会努力找到更好的解决方案,非常感谢。这对我来说更多的是一个评论,而不是回答。这是在电话中回答的问题。。。创建一个好的例子是相当困难的。是的,我通常也通过电话回答。是。。。laborious@Andrew那么你承认打电话回答这个问题了?好主意。实际上我不确定我使用的结构是否适用于此,因为我以前从未做过类似的事情。我更新了关于我想要达到的目标的问题。为了“回答的问题”,我将选择@MatBailie的答案,因为这是对实际问题“我如何能使这个更简单?”的回答。我问这个问题仅仅是因为这个问题让我感觉很糟糕,因为它是重复的,我感觉做了错事。不过,我会尽力找到更好的解决方案,非常感谢。我认为您需要左连接——正如所写的那样,查询不会给出这些结果(除了示例中没有所有数据)。您是对的!我想我错过了一个更好的解决方案来解决这个问题。我不认为这是一个烂摊子——在这样的情况下留下连接在关系数据模型中是可以接受的,如果数据库配置正确,那么性能会很好。我个人一直都是这样做的,而不是做pivot,因为pivot的性能似乎总是更差。我认为您需要左连接——正如我写的那样,查询不会给出这些结果(除了示例中没有所有数据之外)。您是对的!我想我错过了一个更好的解决方案来解决这个问题。我不认为这是一个烂摊子——在这样的情况下留下连接在关系数据模型中是可以接受的,如果数据库配置正确,那么性能会很好。我个人一直都是这样做的,而不是做那些看起来总是表现更差的旋转。