关于SQL语句外连接中的过滤条件
2017-04-29 10:10
239 查看
使用左外连接时,注意以下两点
第一张表的过滤条件写在where子句中
其余各张表的过滤条件写在on子句中
假设有以下两张表
A表
B表
这里两张表呈现为主从关系,A表为父(主)表,B表为子(副)表。
两张表的id字段都是主键,B表的aid字段为指向A表的外键。
两张表中的active字段表示当前记录是否还有效。active=0表示该记录已经被逻辑删除。
现在要求使用左连接结合A表和B表,但是必须过滤掉各自表中已经被逻辑删除(即active=0)的记录。
要求的结果
错误的SQL 1
select A.*, B.*
from A left join B
on A.id = B.aid and A.active=1 and B.active=1
错误的SQL 2
select A.*, B.*
from A left join B
on A.id = B.aid
where A.active=1 and B.active=1
正确的SQL 1
select A.*, B.*
from A left join B
on A.id = B.aid and B.active=1
where A.active=1
正确的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)
正确的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
第一张表的过滤条件写在where子句中
其余各张表的过滤条件写在on子句中
假设有以下两张表
A表
id | active |
---|---|
1 | 1 |
2 | 1 |
3 | 1 |
4 | 0 |
id | aid | active |
---|---|---|
11 | 1 | 1 |
12 | 1 | 0 |
22 | 2 | 1 |
23 | 2 | 1 |
两张表的id字段都是主键,B表的aid字段为指向A表的外键。
两张表中的active字段表示当前记录是否还有效。active=0表示该记录已经被逻辑删除。
现在要求使用左连接结合A表和B表,但是必须过滤掉各自表中已经被逻辑删除(即active=0)的记录。
要求的结果
A.id | A.active | B.id | B.aid | B.active |
---|---|---|---|---|
1 | 1 | 11 | 1 | 1 |
2 | 1 | 22 | 2 | 1 |
2 | 1 | 23 | 2 | 1 |
3 | 1 |
select A.*, B.*
from A left join B
on A.id = B.aid and A.active=1 and B.active=1
A.id | A.active | B.id | B.aid | B.active |
---|---|---|---|---|
1 | 1 | 11 | 1 | 1 |
2 | 1 | 22 | 2 | 1 |
2 | 1 | 23 | 2 | 1 |
3 | 1 | |||
4 | 0 |
select A.*, B.*
from A left join B
on A.id = B.aid
where A.active=1 and B.active=1
A.id | A.active | B.id | B.aid | B.active |
---|---|---|---|---|
1 | 1 | 11 | 1 | 1 |
2 | 1 | 22 | 2 | 1 |
2 | 1 | 23 | 2 | 1 |
select A.*, B.*
from A left join B
on A.id = B.aid and B.active=1
where A.active=1
A.id | A.active | B.id | B.aid | B.active |
---|---|---|---|---|
1 | 1 | 11 | 1 | 1 |
2 | 1 | 22 | 2 | 1 |
2 | 1 | 23 | 2 | 1 |
3 | 1 |
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.id | A.active | B.id | B.aid | B.active |
---|---|---|---|---|
1 | 1 | 11 | 1 | 1 |
2 | 1 | 22 | 2 | 1 |
2 | 1 | 23 | 2 | 1 |
3 | 1 |
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.id | A.active | B.id | B.aid | B.active |
---|---|---|---|---|
1 | 1 | 11 | 1 | 1 |
2 | 1 | 22 | 2 | 1 |
2 | 1 | 23 | 2 | 1 |
3 | 1 |
相关文章推荐
- 关于SQL连接 加条件查询的LINQ表达式写法
- 设计高效的SQL语句过滤条件
- 通过sql语句给F7过滤条件(留意客户端执行Sql的方法)
- sql语句-关于自身表连接之join与left join
- 关于在连接的on后面加过滤条件是否有效的测试
- XsqlFilterResult----动态生成sql语句的类,过滤一些为空的查询条件 .
- 关于sql连接语句中的Integrated Security=SSPI
- SQL有外连接的时候注意过滤条件位置
- 优化原则测试1:先执行过滤掉大部份数据的SQL语句,通过过滤条件搭配减少结果集;
- 关于数据库查询语句SqlDataReader的连接释放问题的解决办法
- XsqlFilterResult----动态生成sql语句的类,过滤一些为空的查询条件
- 关于sql连接语句中的Integrated Security=SSPI
- SQL语句中Where后面最多能连接多少个条件
- SQL有外连接的时候注意过滤条件位置否则会导致网页慢
- 关于sql条件语句where id in (@参数)执行报错问题(转换成数据类型 int 时失败)(
- SQL查询语句精华使用简要----关于连接
- 分享一些常见的SQL语句,包含单表查询、高级查询(连接查询、复合条件查询、嵌套查询等)。
- SQL有外连接的时候注意过滤条件位置
- 数据库关于同一张表不同条件取出数量的横向添加sql语句
- SQL有外连接的时候注意过滤条件位置否则会导致网页慢