如何将Table1列转行并插入带主键外键关联的Table2?
实现Table1列转行并插入Table2(保持主键外键关联)
首先先明确你的原表结构和数据:
-- 原Table1结构与数据 Columns: PK_Table1, Name, DoYouGoToSchool, DoYouhaveACar, DoYouWorkFullTime, DoYouWorkPartTime, Score Data: 1, joe, Yes, Yes, No, Yes 2, amy, No, Yes, Yes, No
假设你已经有了临时表的创建语句(如下):
-- 创建临时表#Table1 CREATE TABLE #Table1 ( PK_Table1 INT PRIMARY KEY, Name VARCHAR(50), DoYouGoToSchool VARCHAR(3), DoYouhaveACar VARCHAR(3), DoYouWorkFullTime VARCHAR(3), DoYouWorkPartTime VARCHAR(3), Score INT ); -- 插入初始数据 INSERT INTO #Table1 (PK_Table1, Name, DoYouGoToSchool, DoYouhaveACar, DoYouWorkFullTime, DoYouWorkPartTime, Score) VALUES (1, 'joe', 'Yes', 'Yes', 'No', 'Yes', NULL), (2, 'amy', 'No', 'Yes', 'Yes', 'No', NULL); -- 创建临时表#Table2(包含外键关联) CREATE TABLE #Table2 ( PK_Table2 INT IDENTITY(1,1) PRIMARY KEY, FK_Table1 INT FOREIGN KEY REFERENCES #Table1(PK_Table1), Question VARCHAR(50), Answer VARCHAR(3) );
接下来是实现列转行并插入#Table2的核心逻辑,这里提供两种常用方法:
方法1:使用UNION ALL逐个列转换
这种方法适合列数量较少的场景,逻辑直观易懂:
INSERT INTO #Table2 (FK_Table1, Question, Answer) SELECT PK_Table1, 'DoYouGoToSchool', DoYouGoToSchool FROM #Table1 UNION ALL SELECT PK_Table1, 'DoYouhaveACar', DoYouhaveACar FROM #Table1 UNION ALL SELECT PK_Table1, 'DoYouWorkFullTime', DoYouWorkFullTime FROM #Table1 UNION ALL SELECT PK_Table1, 'DoYouWorkPartTime', DoYouWorkPartTime FROM #Table1;
方法2:使用CROSS APPLY(更简洁,适合多列场景)
这种方法通过VALUES子句把要转换的列打包成行,代码更紧凑,后续新增列时只需在VALUES里追加即可:
INSERT INTO #Table2 (FK_Table1, Question, Answer) SELECT t.PK_Table1, q.Question, q.Answer FROM #Table1 t CROSS APPLY ( VALUES ('DoYouGoToSchool', t.DoYouGoToSchool), ('DoYouhaveACar', t.DoYouhaveACar), ('DoYouWorkFullTime', t.DoYouWorkFullTime), ('DoYouWorkPartTime', t.DoYouWorkPartTime) ) q(Question, Answer);
验证结果
执行完插入语句后,查询#Table2就能看到预期的关联结果:
SELECT * FROM #Table2;
结果会是:
| PK_Table2 | FK_Table1 | Question | Answer |
|---|---|---|---|
| 1 | 1 | DoYouGoToSchool | Yes |
| 2 | 1 | DoYouhaveACar | Yes |
| 3 | 1 | DoYouWorkFullTime | No |
| 4 | 1 | DoYouWorkPartTime | Yes |
| 5 | 2 | DoYouGoToSchool | No |
| 6 | 2 | DoYouhaveACar | Yes |
| 7 | 2 | DoYouWorkFullTime | Yes |
| 8 | 2 | DoYouWorkPartTime | No |
这样就完美保持了#Table1的PK_Table1和#Table2的FK_Table1之间的主键外键关联关系,同时完成了列转行的需求。
内容的提问来源于stack exchange,提问作者user3920526
相关产品推荐
相关产品推荐

