当前位置: 首页 > news >正文

福州 网站建设常州网警

福州 网站建设,常州网警,网站后台管理系统功能,阿里巴巴1688怎么做网站在日常开发中,我们经常用 LEFT JOIN 来保留左表数据,即使右表没有匹配记录也能查到结果。然而,如果不小心把右表的过滤条件写在了 WHERE 子句里,就会让 LEFT JOIN 失效,变成了“变相 INNER JOIN”。 本文通过一个真实案…

在日常开发中,我们经常用 LEFT JOIN 来保留左表数据,即使右表没有匹配记录也能查到结果。然而,如果不小心把右表的过滤条件写在了 WHERE 子句里,就会让 LEFT JOIN 失效,变成了“变相 INNER JOIN”。

本文通过一个真实案例,分析这个坑的成因、表现和正确写法。


1. 场景背景

我在调试一个查询时,遇到一个很奇怪的现象:

  • 单独查右表子查询是有数据的
  • 但是和左表 LEFT JOIN 之后,结果却是空的

SQL 如下:

SELECTb.project_code,b.account_code,b.group_code,b.group_name,p.finish_date,p.actual_finish_date,p.job_code
FROM (-- 楼栋表,按项目、账户、组团去重SELECT DISTINCTproject_code,account_code,group_code,group_nameFROM t_jsc_ysjgzj_building_account WHERE batch_number = (SELECT max(batch_number) FROM t_jsc_ysjgzj_building_account)AND delete_flag = 0AND group_code IS NOT NULL AND group_code != ''AND account_code = '0200096829000128958'
) b
LEFT JOIN t_jh_all_plan_list_detail pON b.group_code = p.gr_id
WHERE p.delete_flag = 0AND p.is_ignored = 0AND p.job_code IN ('JT00056', 'JT00019');

2. 问题原因

很多人误以为 LEFT JOIN 后写任何条件都能保留左表数据,其实不然。
右表无匹配行 时,右表的所有列都是 NULL

  • 条件 p.delete_flag = 0 等价于 NULL = 0,结果是 FALSE
  • 条件 p.job_code IN (...) 等价于 NULL IN (...),结果也是 FALSE

于是,这些记录在 WHERE 阶段被过滤掉,相当于把 LEFT JOIN 转成了 INNER JOIN


3. 直观对比

写法位置右表无匹配行时左表数据是否保留
条件写在 ON条件判断发生在匹配阶段,右表为 NULL 依然保留左表✅ 保留
条件写在 WHERE条件判断在匹配后过滤阶段,右表 NULL 导致条件不成立❌ 不保留

4. 正确写法

将对右表的过滤条件移动到 ON 子句中:

SELECTb.project_code,b.account_code,b.group_code,b.group_name,p.finish_date,p.actual_finish_date,p.job_code
FROM (SELECT DISTINCTproject_code,account_code,group_code,group_nameFROM t_jsc_ysjgzj_building_account WHERE batch_number = (SELECT max(batch_number) FROM t_jsc_ysjgzj_building_account)AND delete_flag = 0AND group_code IS NOT NULL AND group_code != ''AND account_code = '0200096829000128958'
) b
LEFT JOIN t_jh_all_plan_list_detail pON b.group_code = p.gr_idAND p.delete_flag = 0AND p.is_ignored = 0AND p.job_code IN ('JT00056', 'JT00019');

这样做的好处:

  • 保证了 LEFT JOIN 的“左表优先保留”特性
  • 避免了无匹配数据被误删

5. 总结

  • LEFT JOIN 条件要分清位置

    • 右表条件 → 写在 ON(保留左表数据)
    • 左表条件 → 写在 WHERE(正常过滤)
  • 检查 SQL 结果异常时

    • 看右表字段是否在 WHERE 中被硬性约束
    • 如果是,就考虑挪到 ON
  • 口诀

    LEFT JOIN 不生效,
    多半 WHERE 害的。
    条件放在 ON,
    左表才安全。
    ``
http://www.dtcms.com/a/402116.html

相关文章:

  • 华侨大学英文网站建设3g微网站是什么
  • 哪些网站可以做邀请函宣传平台有哪些
  • 做网站怎么跑业务医疗网站建设平台价格
  • 中山小榄网站专业整站优化
  • jquery 单页网站建设网站好公司简介
  • 蚂蚁网站建设网站建设致谢
  • 建网站带支付链接蓝翔老师做的网站
  • 慈溪企业排名网站好孩子官方网站王建设
  • 网站建设行业细分国外网站众筹怎做
  • 动漫网站网页设计商城网站平台怎么做的
  • 潍坊 优化型网站建设wordpress frp
  • 先做网站 先备案市场调研报告1500字
  • 学做分类网站自己建网站需要多少钱
  • 专业制作网站价格云开发网站
  • wordpress升级说版本低青岛网站seo诊断
  • 网站关键词分隔专业做物流公司网站
  • 友情下载网站客户端 网站开发 手机软件开发
  • 无锡微信网站建设价格公司网站建设7个基本流程
  • 做个小程序需要花多少钱优化关键词步骤
  • 青海海东平安县建设局网站汕头网站建设
  • 没有网站可以做cpa广告么二级域名做外贸网站好吗
  • 开封+网站建设+网络推广随身办app下载
  • 网站怎么做用qq登录接入大创网
  • 网站做app收费标准我国档案网站建设比较分析
  • 知乎免费阅读网站软件开发人员招聘
  • wordpress能做流量站吗哪一些网站可以开户做百度广告
  • 网站注册域名位置做淘宝客的的网站有什么要求
  • 兰州新区城乡建设局网站房源网站建设
  • 中国网站设计门户网站建设工序
  • 网站评论管理怎么做的福州网站建设询q479185700上快