SQL如何从两张列数不同的表按各自条件查询指定列,不使用UNION
解决方案
可以使用JOIN实现该需求,以下是符合你预期输出的实现方案:
核心逻辑说明
你需要的结果规则可以拆解为:
- 所有输出记录必须满足表2的筛选条件
Status IN ('U','P') - 若某条记录的ID同时存在于表1中,则必须额外满足表1的筛选条件
Group='E' AND code='P' - 所有输出字段从表2取值,保证EmpName、Phone字段有有效值
实现代码
写法1:LEFT JOIN实现
SELECT t2.ID, t2.FirstName, t2.LastName, t2.city, t2.EmpName, t2.Phone FROM 表2 t2 LEFT JOIN 表1 t1 ON t1.ID = t2.ID WHERE t2.Status IN ('U', 'P') AND ( t1.ID IS NULL OR (t1.`Group` = 'E' AND t1.code = 'P') )
注意:Group是SQL保留关键字,作为字段名使用时需要加反引号转义。
写法2:EXISTS实现
逻辑和写法1完全一致,多数数据库中执行效率与LEFT JOIN无明显差异:
SELECT ID, FirstName, LastName, city, EmpName, Phone FROM 表2 t2 WHERE t2.Status IN ('U', 'P') AND NOT EXISTS ( SELECT 1 FROM 表1 t1 WHERE t1.ID = t2.ID AND NOT (t1.`Group` = 'E' AND t1.code = 'P') )
扩展场景
如果你需要同时包含表1符合筛选条件但表2不存在的记录(此时EmpName和Phone会返回空值),可以使用UNION补全字段的方式实现:
-- 取表1符合条件的记录,关联表2取扩展字段 SELECT t1.ID, t1.FirstName, t1.LastName, t1.city, t2.EmpName, t2.Phone FROM 表1 t1 LEFT JOIN 表2 t2 ON t1.ID = t2.ID WHERE t1.`Group` = 'E' AND t1.code = 'P' UNION -- 取表2符合条件且不与上表重复的记录 SELECT t2.ID, t2.FirstName, t2.LastName, t2.city, t2.EmpName, t2.Phone FROM 表2 t2 LEFT JOIN 表1 t1 ON t1.ID = t2.ID WHERE t2.Status IN ('U', 'P') AND ( t1.ID IS NULL OR NOT (t1.`Group` = 'E' AND t1.code = 'P') )
内容的提问来源于stack exchange,提问作者langroyia
相关产品推荐
相关产品推荐

