如何合并Employee表关联EmpId的日期字段,使带-A后缀EmpId查询返回有效日期
解决方法
可以通过修改视图vwEmployee,关联原EmpId与带"-A"后缀的EmpId,让带后缀的行自动继承原EmpId的日期值,具体有两种实现方式:
方法一:自连接方式(推荐,性能更优)
修改视图的SQL语句如下:
CREATE OR ALTER VIEW vwEmployee AS SELECT e.EmpId, COALESCE(e.StartDate, base.StartDate) AS StartDate, COALESCE(e.EndDate, base.EndDate) AS EndDate FROM dbo.Employee e LEFT JOIN dbo.Employee base ON REPLACE(e.EmpId, '-A', '') = base.EmpId
逻辑说明
- 用
REPLACE(e.EmpId, '-A', '')提取每个EmpId的基础标识:带"-A"的EmpId会去掉后缀得到原EmpId,原EmpId处理后仍是自身。 - 通过左连接关联到基础标识对应的行,确保带"-A"的行能匹配到原EmpId的记录。
COALESCE函数优先使用当前行的日期值,若当前行日期为NULL(即带"-A"的行),则自动取关联的原EmpId行的日期值。
方法二:子查询方式
如果更倾向于直观的条件判断,也可以用子查询实现:
CREATE OR ALTER VIEW vwEmployee AS SELECT EmpId, CASE WHEN EmpId LIKE '%-A' THEN (SELECT StartDate FROM dbo.Employee WHERE EmpId = REPLACE(EmpId, '-A', '')) ELSE StartDate END AS StartDate, CASE WHEN EmpId LIKE '%-A' THEN (SELECT EndDate FROM dbo.Employee WHERE EmpId = REPLACE(EmpId, '-A', '')) ELSE EndDate END AS EndDate FROM dbo.Employee
逻辑说明
- 通过
LIKE '%-A'判断当前EmpId是否为带后缀的记录。 - 若是带后缀的记录,通过
REPLACE生成原EmpId,再子查询获取对应日期;否则直接使用当前行的日期。
修改完成后,执行select * From vwEmployee where EmpId = 'JS123-A'就能返回原EmpIdJS123对应的日期值,原EmpId的查询结果不受影响。
内容的提问来源于stack exchange,提问作者fdkgfosfskjdlsjdlkfsf
相关产品推荐
相关产品推荐

