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的性能似乎总是更差。我认为您需要左连接——正如我写的那样,查询不会给出这些结果(除了示例中没有所有数据之外)。您是对的!我想我错过了一个更好的解决方案来解决这个问题。我不认为这是一个烂摊子——在这样的情况下留下连接在关系数据模型中是可以接受的,如果数据库配置正确,那么性能会很好。我个人一直都是这样做的,而不是做那些看起来总是表现更差的旋转。