更新您可以像这样使用SQL
INSERT INTO branch_table (id, branch_id)
SELECT e.id, SUBSTRING_INDEX(SUBSTRING_INDEX(e.branch_ids, ',', n.n), ',', -1) branch_id
FROM eligibility_table e CROSS JOIN
(
SELECT a.N + b.N * 10 + 1 n
FROM
(SELECT 0 AS N UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) a
,(SELECT 0 AS N UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) b
ORDER BY n
) n
WHERE n.n <= 1 + (LENGTH(e.branch_ids) - LENGTH(REPLACE(e.branch_ids, ',', '')))
ORDER BY id, branch_id
>在使用UNION ALL和CROSS JOIN的特定情况下,别名为n的子查询动态生成1到100的数字序列(数字或计数表).有时在数据库中有一个真正的计数表很方便.
>在外部选择最里面的SUBSTRING_INDEX()获取列表中第n个元素的所有内容,外部SUBSTRING_INDEX()提取最后一个分隔符后有效获得第n个元素本身的最右边部分.
> CROSS JOIN允许我们生成一组行,这是一个笛卡尔积(n中有100行,eligibility_table中有所有行)
WHERE子句中的条件过滤掉结果集中的所有不必要的行
注意:此查询最多可拆分100个分支ID.如果您需要更多或更少,可以通过编辑内部子查询来调整限制
结果在branch_table中:
| ID | BRANCH_ID |
------------------
| 1 | 621 |
| 1 | 622 |
| 1 | 623 |
| 1 | 625 |
| 2 | 621 |
| 2 | 650 |