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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 13:54:03