left join 与where

本文讲述了在进行三个表联合查询时遇到的问题及解决方法。作者最初使用WHERE条件进行连接,但发现偶尔查询不到数据,原因是表间ID不总是能对应。通过使用LEFT JOIN改进查询,并逐步调整SQL语法,最终实现了高效的数据检索。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

今天项目中遇到个问题,

有三个表需要联合查询,我起初用的是where条件,语句是

select c.ce_id,c.ce_name, p.pro_name, b.brand_name
          from pps_ad_corporation_event c, pps_ad_brand b, pps_ad_profession p
         where p.pro_id = c.pro_id
           and b.brand_id = c.brand_id and c.ce_name like 
测试没什么问题,可是偶尔会差不到,经过测试,原来数据录入时,有的时候这几个表偶儿会无法关联,也就是id无法对应上,所以果断使用left join,开始的语句是这样写的
select c.ce_id, c.ce_name, p.pro_name, b.brand_name
                  from pps_ad_corporation_event c 
                  left join pps_ad_brand b
                    on b.brand_id = c.brand_id
                  left join pps_ad_profession p
                    on p.pro_id = c.pro_id where ce_name like '%%' and rownum < 5

这样出现的问题主要like条件不能成立,还有ROWNUM<5条件不能成立,看来是sql语法有问题,查了下资料,更改成
select *
          from (select c.ce_id, c.ce_name, p.pro_name, b.brand_name
                  from pps_ad_corporation_event c 
                  left join pps_ad_brand b
                    on b.brand_id = c.brand_id
                  left join pps_ad_profession p
                    on p.pro_id = c.pro_id
                   )
          where ce_name like '%运%' and ROWNUM <= 5

虽然结果正确,但是大家可以看到,这样的效率不高,所以我有改进了一下
with c as (select * from pps_ad_corporation_event  where ce_name like '%运%' and rownum <= 5)   
       select * from c left join pps_ad_brand b
          on b.brand_id = c.brand_id
        left join pps_ad_profession p
          on p.pro_id = c.pro_id
      

另外推荐一个网站,国外的技术交流网站 http://stackoverflow.com/questions/tagged/php


### SQLLEFT JOINWHERE子句的结合使用 在SQL查询语句里,`LEFT JOIN`用于返回左表中的所有记录以及右表中存在的匹配记录;如果右表无匹配记录,则结果集中对应的右表字段为NULL。当把过滤条件放置于`ON`子句内时,这些条件仅影响连接操作本身,而不会减少最终的结果集大小。然而,一旦将相同的逻辑置于`WHERE`子句之后,这实际上会对整个已连接后的数据集施加筛选效果,从而可能排除掉那些原本应该保留下来的来自左侧表但是右侧没有对应关系的数据行[^1]。 对于想要找出特定条件下存在于左表却不存在于右表的情况而言,在构建查询时应当注意: - 使用`LEFT JOIN`来确保左边表格的所有条目都被考虑进来; - 将必要的联接规则定义到`ON`部分; - 把用来限定哪些不满足配对情况下的额外约束放到`WHERE`后面处理,比如通过判断右边某列是否为NULL实现只取未成功关联上的项目[^4]。 下面给出一段具体的Python风格伪代码作为示范说明如何编写这样的SQL查询: ```sql SELECT * FROM table_a AS a LEFT JOIN table_b AS b ON a.id = b.foreign_id WHERE b.foreign_id IS NULL; ``` 这段脚本的作用是从`table_a`选出所有的记录,并尝试依据ID键值去寻找各自在`table_b`里的映射对象。最后一步则是利用`WHERE`进一步缩小范围至那些找不到任何关联伙伴的情形——即`b.foreign_id IS NULL`所指示的状态[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值