You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将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_Table2FK_Table1QuestionAnswer
11DoYouGoToSchoolYes
21DoYouhaveACarYes
31DoYouWorkFullTimeNo
41DoYouWorkPartTimeYes
52DoYouGoToSchoolNo
62DoYouhaveACarYes
72DoYouWorkFullTimeYes
82DoYouWorkPartTimeNo

这样就完美保持了#Table1的PK_Table1和#Table2的FK_Table1之间的主键外键关联关系,同时完成了列转行的需求。

内容的提问来源于stack exchange,提问作者user3920526

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 09:51:41