您的位置:首页 > 数据库

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

2017-04-29 10:10 239 查看
使用左外连接时,注意以下两点

第一张表的过滤条件写在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   
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: