如何编写单条Vertica查询实现Location到Employees表的条件插入需求
实现方案
核心逻辑
通过UNION ALL拼接两种场景的查询结果,搭配存在性校验保证同一时间只会返回一种场景的待插入数据,全程仅需执行一次插入语句即可满足需求。
通用SQL写法(兼容PostgreSQL、SQL Server、Oracle、高版本MySQL)
INSERT INTO Employees (Emp_name, Salary, Location_nme) -- 场景1:存在location_cd=66的记录时取业务数据 SELECT Emp_name, Salary, Loction_nme FROM Location WHERE Location_cd = 66 UNION ALL -- 场景2:不存在对应记录时插入兜底数据 SELECT 'Unknown', -99, 'Not Available' WHERE NOT EXISTS ( SELECT 1 FROM Location WHERE Location_cd = 66 );
适配低版本MySQL的写法
如果运行时提示SELECT语句后缺少FROM子句错误,使用以下版本:
INSERT INTO Employees (Emp_name, Salary, Location_nme) SELECT Emp_name, Salary, Loction_nme FROM Location WHERE Location_cd = 66 UNION ALL SELECT * FROM ( SELECT 'Unknown' AS Emp_name, -99 AS Salary, 'Not Available' AS Location_nme ) AS temp_data WHERE NOT EXISTS ( SELECT 1 FROM Location WHERE Location_cd = 66 );
说明
- 当
Location表存在location_cd=66的记录时,UNION ALL前半段返回匹配结果,后半段的NOT EXISTS校验不通过无返回,仅插入业务数据 - 当
Location表不存在location_cd=66的记录时,UNION ALL前半段无返回,后半段校验通过返回兜底数据完成插入
内容的提问来源于stack exchange,提问作者nodev_101
相关产品推荐
相关产品推荐

