我有一个包含多个记录的表,这些记录具有相同的 ID 但不同的值。我想将记录从其他表复制到该表。我想如果记录为空则更新到最小位置,或者如果该值不存在则插入到下一个位置。
这是我的目标表:
ID |职位|值(value)
1 | 1 |
2 | 1 |
2 | 2 |空
2 | 3 |空
2 | 4 | C
3 | 1 |
4 | 1 | D
4 | 2 | B
源表:
ID |值(value)
1 | C
2 |否
3 |
4 | D
5 |
6 |空
7 | B
想要的结果表:
ID |职位|值(value)
1 | 1 |
1 | 2 | C
2 | 1 |
2 | 2 |否
2 | 3 |空
2 | 4 | C
3 | 1 |
3 | 2 |
4 | 1 | D
4 | 2 |
5 | 1 |
7 | 1 | B
我的查询是:
合并目标 AST
USING (SELECT S.ID, MAX(E.POS) AS PosMax, MIN(E.POS) as PosMin, S.Value
来自来源S
LEFT OUTER JOIN 目标 E ON S.ID = E.ID
其中 S.Value 不为 NULL 并且 E.Value 为 NULL
按 S.ID、S.Value 分组)AS SC
ON T.ID = SC.ID
当匹配且 SC.Value 不为 NULL 且 EG.Value 为 NULL 且 T.POS = SC.PosMin
那么
更新设置
EG.Value = SC.Value
当不匹配且 SC.Value 不为空时
然后
INSERT(ID、位置、值)
VALUES (SC.D, ISNULL(SC.PosMax, 0) + 1, SC.Value);
这只更新最小位置的空值,如果不存在ID则插入该值。如果这个ID存在的话。它不会插入,因为匹配 T.ID = SC.ID。
ID 3的示例,它没有在位置2插入值B。
有人有不同的方法或策略吗?或者,如果 ID 相同但值不同,我必须编写第二个查询来插入。
谢谢
杰伊
最佳答案
我认为您的 ON 也需要这个职位。 ON T.ID = SC.ID 且 T.pos=SC.minpos。
构建 SC 的子查询应该是内连接。如果目标中没有匹配的值,则您不需要记录。
关于mysql - 不存在时插入null时更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58293044/