ĐÃ CẬP NHẬT Bạn có thể làm điều đó với SQL như thế này
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
- Truy vấn con có bí danh là n sẽ tạo nhanh một chuỗi số (số hoặc bảng kiểm đếm) từ 1 đến 100 trong trường hợp cụ thể này bằng cách sử dụng
UNION ALL
vàCROSS JOIN
. Đôi khi, thật tiện lợi khi có một bảng kiểm đếm thực sự trong db của bạn . - Trong ngoài cùng, hãy chọn trong cùng
SUBSTRING_INDEX()
nhận mọi thứ lên đến phần tử thứ n trong danh sách vàSUBSTRING_INDEX()
bên ngoài trích xuất phần lớn bên phải sau dấu phân cách cuối cùng để nhận phần tử thứ n một cách hiệu quả. -
CROSS JOIN
cho phép chúng tôi tạo ra một tập hợp các hàng là sản phẩm của cartesian (gồm 100 hàng trong n và tất cả các hàng trong eli đủ điều kiện_table) - điều kiện trong
WHERE
mệnh đề lọc ra tất cả các hàng không cần thiết khỏi tập kết quả
Lưu ý:truy vấn này sẽ chia ra tối đa 100 id nhánh. Nếu bạn cần nhiều hơn hoặc ít hơn, bạn có thể điều chỉnh giới hạn bằng cách chỉnh sửa truy vấn con bên trong
Kết quả trong branch_table:
| ID | BRANCH_ID | ------------------ | 1 | 621 | | 1 | 622 | | 1 | 623 | | 1 | 625 | | 2 | 621 | | 2 | 650 |
Đây là SQLFiddle bản demo