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

在MS SQL Server中创建合并视图并实现连续递增ID

合并三个表为连续ID视图的SQL Server解决方案

没问题,我来帮你搞定这个需求。首先得明确三个原表到目标视图的字段对应关系,核心要解决的是连续递增ID的逻辑——让Answer2的ID从Answer1的总记录数+1开始,Answer3的ID从Answer1+Answer2的总记录数+1开始,完美衔接上一个表的最后ID。

字段对应关系梳理

先把每个原表的字段映射到视图的固定字段上,确保结构统一:

视图固定字段Answer1对应字段Answer2对应字段Answer3对应字段
IDAnswerIDIDID
QuestionnaireIDQuestionnaireIDQuestionnaireIdQuestID
EmployeeNameEmployeeNameEmployeenameEmployeeName
PcNamePcNamePcNamePcName
AnswerAnswerAnswerTextAnswer
AnswerDateAnswerDateAnswerDateAns_Date

实现视图的SQL代码

下面是创建视图的完整SQL语句,我们用子查询计算每个表的总记录数作为ID的偏移量,确保ID绝对连续:

CREATE VIEW MergedAnswers AS
-- 第一个表Answer1,ID直接沿用原AnswerID
SELECT
    AnswerID AS ID,
    QuestionnaireID,
    EmployeeName,
    PcName,
    Answer,
    AnswerDate
FROM Answer1

UNION ALL

-- 第二个表Answer2,ID = 原ID + Answer1的总记录数
SELECT
    ID + ISNULL((SELECT COUNT(*) FROM Answer1), 0) AS ID,
    QuestionnaireId AS QuestionnaireID,
    Employeename AS EmployeeName,
    PcName,
    AnswerText AS Answer,
    AnswerDate
FROM Answer2

UNION ALL

-- 第三个表Answer3,ID = 原ID + Answer1总记录数 + Answer2总记录数
SELECT
    ID + ISNULL((SELECT COUNT(*) FROM Answer1), 0) + ISNULL((SELECT COUNT(*) FROM Answer2), 0) AS ID,
    QuestID AS QuestionnaireID,
    EmployeeName,
    PcName,
    Answer,
    Ans_Date AS AnswerDate
FROM Answer3;

关键逻辑说明

  1. 使用UNION ALL而非UNION:因为我们要保留所有原始记录(不会有重复ID的问题,偏移处理已经规避),UNION ALL性能更高且不会自动去重,更适合这个场景。
  2. 连续ID的计算:
    • Answer2的每个ID都加上Answer1的总记录数,让它的第一条记录ID刚好是Answer1最后一个ID+1。
    • Answer3的每个ID加上前两个表的总记录数之和,完美衔接Answer2的最后一个ID。
    • 用ISNULL(..., 0)处理原表为空的情况,避免出现NULL导致ID计算错误。
  3. 字段别名统一:通过AS关键字把每个原表的字段统一成视图的固定字段名,确保视图输出结构完全一致。

注意事项

  • 视图是动态的:如果原表新增或删除记录,视图的ID会自动重新计算,始终保持连续状态。
  • 性能优化建议:如果三个表数据量很大,每次查询视图时计算COUNT(*)可能影响性能。若数据变化不频繁,可以考虑创建索引视图(SQL Server的物化视图)来优化,但需要满足索引视图的创建条件(比如所有基础表都要设置主键等)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 07:41:07