select a.字段,b.字段,c.字段
from a
left join b on b.id=a.id
left join c on b.某字段=c.某字段理解成数据库先执行了
select a.字段,b.字段,c.字段
from a
left join b on b.id=a.id
然后将上面语句的结果集再left join c on b.某字段=c.某字段
我的理解对吗?如不对请赐教。
from a
left join b on b.id=a.id
left join c on b.某字段=c.某字段理解成数据库先执行了
select a.字段,b.字段,c.字段
from a
left join b on b.id=a.id
然后将上面语句的结果集再left join c on b.某字段=c.某字段
我的理解对吗?如不对请赐教。
解决方案 »
- SQL模糊查询按照匹配度Order
- 本人材料专业高级工程师+高程(2005年考过)+系分(2006年考过),现想搞软件开发,没有资金,没有客户。哪里能找到投资渠道呢?哪里能找到客户呢?如何起步呢?
- 根据当前主表的ID获取下面子表信息的问题
- 关于删除问题!
- SQL6.5为什么这么烂!有用6.5的大虾吗?请教问题
- excel批量导入MSSQL2005 多表关系怎么办,在线等
- 请问有哪位配过sql邮件,用xp_sendmail发送邮件!请多多指点!
- 在导数据的过程中丢了主键和自动累加
- 关于sysobjects查询得到表名后的处理的问题
- 错误 14258:当 SQLServerAgent 正在启动时,无法执行此操作。请稍候再试。
- server 2000 一个表的字段属性是image,内容一栏只显示<binary>.请问如何能看到其内容?
- DB2误改管理员账户名称无法恢复!
指定在结果集中包括左表中所有不满足联接条件的行,并在由内部联接返回所有的行之外,将另外一个表的输出列设为 NULL。
在满足B同时满足C条件时显示C表数据,其它C表显示为NULL
declare @表A table (aID int,aNum varchar(9))
insert into @表A
select 1,'a20050111' union all
select 2,'a20050112' union all
select 3,'a20050113' union all
select 4,'a20050114' union all
select 5,'a20050115'
declare @表B table (bID int,bName varchar(12))
insert into @表B
select 1,'2006032401' union all
select 2,'2006032402' union all
select 3,'2006032403' union all
select 4,'2006032404' union all
select 8,'2006032408'
--左联等价于 left outer join (一个表的所有行和另一个表满足条件的行)
select * from @表A a left join @表B b on a.aID=b.bID;
/*
aID aNum bID bName
----------- --------- ----------- ------------
1 a20050111 1 2006032401
2 a20050112 2 2006032402
3 a20050113 3 2006032403
4 a20050114 4 2006032404
5 a20050115 NULL NULL
*/
--右联等价于 right outer join
select * from @表A a right join @表B b on a.aID=b.bID;
/*
aID aNum bID bName
----------- --------- ----------- ------------
1 a20050111 1 2006032401
2 a20050112 2 2006032402
3 a20050113 3 2006032403
4 a20050114 4 2006032404
NULL NULL 8 2006032408
*/
--笛卡尔乘积
select * from @表A a cross join @表B b;
/*
aID aNum bID bName
----------- --------- ----------- ------------
1 a20050111 1 2006032401
2 a20050112 1 2006032401
3 a20050113 1 2006032401
4 a20050114 1 2006032401
5 a20050115 1 2006032401
1 a20050111 2 2006032402
2 a20050112 2 2006032402
3 a20050113 2 2006032402
4 a20050114 2 2006032402
5 a20050115 2 2006032402
1 a20050111 3 2006032403
2 a20050112 3 2006032403
3 a20050113 3 2006032403
4 a20050114 3 2006032403
5 a20050115 3 2006032403
1 a20050111 4 2006032404
2 a20050112 4 2006032404
3 a20050113 4 2006032404
4 a20050114 4 2006032404
5 a20050115 4 2006032404
1 a20050111 8 2006032408
2 a20050112 8 2006032408
3 a20050113 8 2006032408
4 a20050114 8 2006032408
5 a20050115 8 2006032408
*/
--内联等价于 inner join
select * from @表A a join @表B b on a.aID=b.bID;
/*
aID aNum bID bName
----------- --------- ----------- ------------
1 a20050111 1 2006032401
2 a20050112 2 2006032402
3 a20050113 3 2006032403
4 a20050114 4 2006032404
*/
--外联
select * from @表A a full outer join @表B b on a.aID=b.bID;
/*
aID aNum bID bName
----------- --------- ----------- ------------
1 a20050111 1 2006032401
2 a20050112 2 2006032402
3 a20050113 3 2006032403
4 a20050114 4 2006032404
5 a20050115 NULL NULL
NULL NULL 8 2006032408
*/参考理解下!
在此针对楼主指出.
数据库先执行了 left join b on b.id=a.id
然后将上面语句的结果集再left join c on b.某字段=c.某字段
换句话说也就是一层一层的left join下来,
最后执行select a.字段,b.字段,c.字段 输出结果
如有不对欢迎探讨.
可以测试一下,相同结构的三个表
select *
from Table_2 a left join Table_3 b
on a.CODE =b.CODE
left join Table_4 c on b.CODE =c.CODE
与
select *
from Table_2 a left join Table_3 b
on a.CODE =b.CODE
left join Table_4 c on a.CODE =c.CODE
他们的结果是不一样的
同意.只是说这里最后执行Select * 输出结果.但是结果取决于条件语句