SQL Server双表JSON解析插入的最佳实现方案咨询
SQL Server双表JSON解析插入的最佳实现方案咨询
我是SQL新手,最近碰到一个双表数据处理的问题,想找个最优的解决办法。我有两个表,结构和现有数据如下:
Table1
| A | B | C |
|---|---|---|
| aa | bb | js[12] |
| cc | dd | js[45] |
说明:Table1的A列是自增ID,应用会把JSON格式的数据存入C列,示例里的js[12]是简化后的JSON内容
Table2
| A | B | C | D |
|---|---|---|---|
| aa | bb | js[1] | js[2] |
| cc | dd | js[4] | js[5] |
我的需求是:解析Table1中C列的JSON数据,把拆分出来的对应字段插入到Table2里。我已经搞懂了怎么解析JSON和执行插入操作,但卡在了如何正确关联两张表的数据——毕竟插入的时候需要对应上Table1每条记录的归属,确保解析后的数据能准确放到Table2的对应行里,不知道最合理的实现方式是什么。
针对这个场景,我给你几个实用的解决方案:
1. 基础插入(一次性同步)
如果只是想把Table1中所有符合条件的记录解析后插入Table2,可以用INSERT...SELECT结合JSON解析函数:
-- 假设Table1的C列是JSON对象,比如{"c": "js[1]", "d": "js[2]"} INSERT INTO Table2 (A, B, C, D) SELECT t1.A, t1.B, JSON_VALUE(t1.C, '$.c') AS parsed_C, JSON_VALUE(t1.C, '$.d') AS parsed_D FROM Table1 t1 -- 可以加条件过滤不需要同步的记录,比如只同步未处理过的 WHERE NOT EXISTS ( SELECT 1 FROM Table2 t2 WHERE t2.A = t1.A -- 用自增ID关联,确保唯一性 )
2. 解析JSON数组的情况
如果Table1的C列是JSON数组(比如["js[1]", "js[2]"]),需要拆分到Table2的C、D列,可以用CROSS APPLY配合OPENJSON来解析:
INSERT INTO Table2 (A, B, C, D) SELECT t1.A, t1.B, j.parsed_C, j.parsed_D FROM Table1 t1 CROSS APPLY ( SELECT JSON_VALUE(t1.C, '$[0]') AS parsed_C, JSON_VALUE(t1.C, '$[1]') AS parsed_D ) j WHERE NOT EXISTS ( SELECT 1 FROM Table2 t2 WHERE t2.A = t1.A )
3. 增量同步+更新(支持新增和修改)
如果需要既同步新插入的Table1记录,又能更新Table2中已有的对应记录,可以用MERGE语句,这是比较灵活的方案:
MERGE INTO Table2 t2 USING ( SELECT A, B, JSON_VALUE(C, '$.c') AS parsed_C, JSON_VALUE(C, '$.d') AS parsed_D FROM Table1 ) t1 ON t2.A = t1.A WHEN MATCHED THEN -- 当Table2已有对应记录时,更新C、D列 UPDATE SET t2.C = t1.parsed_C, t2.D = t1.parsed_D WHEN NOT MATCHED THEN -- 当Table2没有对应记录时,插入新行 INSERT (A, B, C, D) VALUES (t1.A, t1.B, t1.parsed_C, t1.parsed_D);
小提示:
因为Table1的A列是自增ID,你可以利用这个特性做增量同步——比如每次同步后记录下最大的A值,下次同步只处理A大于这个值的记录,这样能提升效率,避免重复处理。
备注:内容来源于stack exchange,提问作者sadmin
相关产品推荐
相关产品推荐

