如何将T1数据表拆分至Person表(T2)与PersonClientLink表(T3)
数据库表拆分实操步骤
表结构说明
T1 - 当前数据表
| ID | Client_Id | Name |
|---|---|---|
| 1 | 5 | Bob |
| 2 | 6 | Bob |
| 3 | 7 | Greg |
| 4 | 8 | Greg |
T2 - 目标Person表(需生成)
| ID | Name |
|---|---|
| 1 | Bob |
| 2 | Greg |
T3 - 目标PersonClientLink表(需填充)
| ID | Person_Id | Client_Id |
|---|---|---|
| 1 | 1 | 5 |
| 2 | 1 | 6 |
| 3 | 2 | 7 |
| 4 | 2 | 8 |
具体操作步骤
第一步:生成Person表(T2)
从T1中提取去重的人员数据插入到T2。如果T2的ID是自增主键,用以下SQL:INSERT INTO T2 (Name) SELECT DISTINCT Name FROM T1;要是需要手动按规则生成ID(比如按姓名排序),可以用窗口函数(以MySQL为例):
INSERT INTO T2 (ID, Name) SELECT DENSE_RANK() OVER(ORDER BY Name) AS ID, Name FROM T1 GROUP BY Name;第二步:填充PersonClientLink表(T3)
关联T1和T2,把人员与客户的对应关系插入T3。若T3的ID是自增主键:INSERT INTO T3 (Person_Id, Client_Id) SELECT t2.ID, t1.Client_Id FROM T1 JOIN T2 ON t1.Name = t2.Name;手动生成T3的ID则用:
INSERT INTO T3 (ID, Person_Id, Client_Id) SELECT ROW_NUMBER() OVER(ORDER BY t2.ID, t1.Client_Id) AS ID, t2.ID AS Person_Id, t1.Client_Id FROM T1 JOIN T2 ON t1.Name = t2.Name;第三步:将T1改造为T2
先备份原表防止数据丢失:CREATE TABLE T1_backup AS SELECT * FROM T1;再删除原T1,把T2重命名为T1:
DROP TABLE T1; ALTER TABLE T2 RENAME TO T1;
注意事项
- 操作前必须备份所有数据,避免误操作导致数据丢失
- 如果存在同名不同人的情况,需要额外的区分字段,否则会错误合并数据
- 不同数据库的语法略有差异(比如窗口函数支持、自增字段写法),需根据你的数据库类型(MySQL、PostgreSQL、SQL Server等)调整SQL语句
内容的提问来源于stack exchange,提问作者Usiek
相关产品推荐
相关产品推荐

