如何基于两张SQL表创建含来源列且无重复数据的视图?
从dbo.Master和dbo.Economics创建带来源标记的无重复视图
需求明确
- 基于
dbo.Master和dbo.Economics两张表创建视图 - 新增
Source列,标记每行数据的来源表 - 视图输出不含重复的
EmployeeID(注:你原代码中EmplyoeeID应为拼写错误,统一修正为EmployeeID)
原代码问题点
- 表名不匹配:代码中使用的
MasterTable、ResourceTable与实际需求的dbo.Master、dbo.Economics不符 - 拼写错误:
EmplyoeeID应为EmployeeID - 逻辑可优化:原写法可以更简洁高效
正确的视图创建方案
方案1:优先保留Master表数据,仅添加Economics中独有的记录(高效写法)
CREATE VIEW dbo.vw_Employee_Source AS -- 先取Master表的所有数据,标记来源为'Master' SELECT EmployeeID, 'Master' AS Source FROM dbo.Master UNION ALL -- 再取Economics表中不存在于Master表的记录,标记来源为'Economics' SELECT e.EmployeeID, 'Economics' AS Source FROM dbo.Economics e LEFT JOIN dbo.Master m ON e.EmployeeID = m.EmployeeID WHERE m.EmployeeID IS NULL;
- 用
UNION ALL替代UNION,避免不必要的排序去重开销,性能更优 - 通过
LEFT JOIN + IS NULL筛选出Economics表独有的数据,确保视图中无重复EmployeeID
方案2:使用UNION自动去重(适用于简单场景)
如果不需要特别关注性能,也可以直接用UNION(UNION会自动合并重复行),注意当同一EmployeeID在两张表都存在时,UNION会只保留一条,且优先保留先出现的记录(即Master表的那条):
CREATE VIEW dbo.vw_Employee_Source AS SELECT EmployeeID, 'Master' AS Source FROM dbo.Master UNION SELECT EmployeeID, 'Economics' AS Source FROM dbo.Economics;
方案3:先对单表去重再合并(若单表内部存在重复数据)
如果两张表各自内部存在重复的EmployeeID,可以先对单表去重,再合并:
CREATE VIEW dbo.vw_Employee_Source AS SELECT DISTINCT EmployeeID, 'Master' AS Source FROM dbo.Master UNION ALL SELECT DISTINCT e.EmployeeID, 'Economics' AS Source FROM dbo.Economics e LEFT JOIN dbo.Master m ON e.EmployeeID = m.EmployeeID WHERE m.EmployeeID IS NULL;
内容的提问来源于stack exchange,提问作者MasterShifu
相关产品推荐
相关产品推荐

