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

来源:互联网 发布:scada系统数据分析 编辑:程序博客网 时间:2024/05/24 03:20

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

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

假设有以下两张表
A表idactive11213140B表idaidactive1111121022212321这里两张表呈现为主从关系,A表为父(主)表,B表为子(副)表。
两张表的id字段都是主键,B表的aid字段为指向A表的外键。
两张表中的active字段表示当前记录是否还有效。active=0表示该记录已经被逻辑删除。
现在要求使用左连接结合A表和B表,但是必须过滤掉各自表中已经被逻辑删除(即active=0)的记录。
要求的结果A.idA.activeB.idB.aidB.active11111121222121232131   

错误的SQL 1
select A.*, B.*
from A left join B
on A.id = B.aid and A.active=1 and B.active=1A.idA.activeB.idB.aidB.active11111121222121232131   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.active111111212221212321

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

正确的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.active11111121222121232131   

正确的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.aidA.idA.activeB.idB.aidB.active11111121222121232131   

0 0
原创粉丝点击