关于SQL语句外连接中的过滤条件

使用左外连接时,注意以下两点

  • 第一张表的过滤条件写在where子句中
  • 其余各张表的过滤条件写在on子句中

假设有以下两张表
A表

idactive
11
21
31
40
B表
idaidactive
1111
1210
2221
2321
这里两张表呈现为主从关系,A表为父(主)表,B表为子(副)表。
两张表的id字段都是主键,B表的aid字段为指向A表的外键。
两张表中的active字段表示当前记录是否还有效。active=0表示该记录已经被逻辑删除。
现在要求使用左连接结合A表和B表,但是必须过滤掉各自表中已经被逻辑删除(即active=0)的记录。
要求的结果
A.idA.activeB.idB.aidB.active
111111
212221
212321
31   

错误的SQL 1
select A.*, B.*
from A left join B
on A.id = B.aid and A.active=1 and B.active=1

A.idA.activeB.idB.aidB.active
111111
212221
212321
31   
40   

错误的SQL 2
select A.*, B.*
from A left join B
on A.id = B.aid
where A.active=1 and B.active=1

A.idA.activeB.idB.aidB.active
111111
212221
212321

正确的SQL 1
select A.*, B.*
from A left join B
on A.id = B.aid and B.active=1
where A.active=1

A.idA.activeB.idB.aidB.active
111111
212221
212321
31   

正确的SQL 2
select A.*, B.*
from A left join B
on A.id = B.aid
where A.active=1
and (B.id is null or B.active=1)

A.idA.activeB.idB.aidB.active
111111
212221
212321
31   

正确的SQL 3
select A.*, B.*
from (select * from A where A.active=1) A
left join (select * from B where B.active=1) B
on A.id = B.aid

A.idA.activeB.idB.aidB.active
111111
212221
212321
31   

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值