更新你可以用这样的 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
- 别名为 n 的子查询使用
UNION ALL
and动态生成从 1 到 100 的数字序列(数字或计数表) CROSS JOIN
。有时在 db 中有一个真正的计数表会很方便。
- 在外部选择最内层
SUBSTRING_INDEX()
获取列表中第 n 个元素的所有内容,并SUBSTRING_INDEX()
在最后一个分隔符有效获取第 n 个元素本身之后的大部分外部提取。
CROSS JOIN
允许我们生成一组作为笛卡尔积的行(n 中的 100 行和资格表中的所有行)
- condition in
WHERE
子句从结果集中过滤掉所有不必要的行
注意:此查询最多可拆分 100 个分支 ID。如果您需要更多或更少,您可以通过编辑内部子查询来调整限制
分支表中的结果:
| 身份证 | BRANCH_ID |
------------------
| 1 | 621 |
| 1 | 第622章
| 1 | 第623章
| 1 | 625 |
| 2 | 621 |
| 2 | 650 |
这是SQLFiddle演示