You need to enable JavaScript to run this app. SQL左连接查询:如何返回首表全量记录并展示次表无匹配空值
优惠活动
大模型
产品
解决方案
定价
更多

SQL左连接查询:如何返回首表全量记录并展示次表无匹配空值

问题根因

当前写法仅返回2条匹配记录的核心原因是:将次表的筛选条件放置在WHERE子句中,直接导致LEFT JOIN的左表全量保留效果失效。
LEFT JOIN的执行逻辑是保留左表所有行,匹配关联右表符合条件的行。如果在WHERE中写入second_table.applicant_id = 1的判断,会直接把左表保留的、无次表匹配数据的行全部过滤——因为这些行的second_table.applicant_id字段值为NULL,根本无法满足等值判断条件,最终结果就只剩有实际匹配的2条记录,丢失了FIRST_TABLE的全量数据。原写法中附带的按first_table.rid分组逻辑,无法解决WHERE条件提前过滤无匹配行的核心问题,当前需求下也无需额外加分组。

正确实现逻辑

要实现覆盖FIRST_TABLE全部rid、无匹配时按要求补值的效果,需要做两点调整:

  • 把针对次表applicant_id=1的筛选条件,从WHERE子句移动到LEFT JOIN的ON关联条件中
    调整后,连接匹配阶段就只捞取符合applicant_id=1的次表记录,没有匹配的FIRST_TABLE行依然会被完整保留,次表对应字段自动填充为NULL
  • 对需要固定值的字段用COALESCE做空值替换
    连接后无匹配行的applicant_id为NULL,需要替换为目标值1,remarks字段保留NULL即可,完全匹配预期要求
参考实现SQL
SELECT
  ft.rid,
  ft.requirements,
  -- 将无匹配的NULL值替换为目标applicant_id=1
  COALESCE(st.applicant_id, 1) AS applicant_id,
  st.remarks
FROM FIRST_TABLE ft
LEFT JOIN SECOND_TABLE st
  ON ft.rid = st.rid
  -- 次表的筛选条件放在ON中,不影响左表全量保留
  AND st.applicant_id = 1
ORDER BY ft.rid
最终返回结果

上述SQL执行后会返回4行完全符合预期的记录:

  • rid=1(2x2 pic):匹配次表已有记录,applicant_id=1,remarks为对应pass值
  • rid=2(valid id):匹配次表已有记录,applicant_id=1,remarks为对应pass值
  • rid=3(137 form):无匹配,applicant_id=1,remarks为NULL
  • rid=4(app form):无匹配,applicant_id=1,remarks为NULL

内容的提问来源于stack exchange,提问作者Del

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.11.10 19:36:07