日期:2014-05-18  浏览次数:20599 次

join的几点疑问
select   A.*.B.*,C.*
from   (select   *   from   A1   where   条件1)   A  
left   join  
(select   *   from   B1   where   条件2)   B
right   join  
(select   *   from   C1   where   条件3)   C
on   A.id=B.id
on   B.name=c.name

问题
1   C到底与哪个表进行联接由   on   B.name=c.name条件指定,而不是只能与出现在from   中的第一个表A联接?

2   ON指定的条件是不是要A,B,C三个表全部生成以后才会进行判定

3   A表生成后才会生成B表,但在条件2中却不能访问A表中的数据,为什么?

------解决方案--------------------
--我的理解,不知对不对。
select A.*.B.*,C.*
from (select * from A1 where 条件1) A
left join (select * from B1 where 条件2) B on A.id=B.id
right join (select * from C1 where 条件3) C on B.name=c.name

问题
1 C到底与哪个表进行联接由 on B.name=c.name条件指定。嗯。

2 ON指定的条件是不是要A,B,C三个表全部生成以后才会进行判定。嗯。

3 A表生成后才会生成B表?——应该可以看作同时生成的吧。
在条件2中却不能访问A表中的数据。A、B、C是三个毫不相关的子查询,谁也不能访问谁。

------解决方案--------------------
因为不想建表才写成了这样....

select (select 1+2) as '列一 ',2 as '列二 '
这里把(select 1+2)as '列一 '看成一个子查询~然后给他一个别名 '列一 '
而这个 '列一 '只能在彻底的完成了这个级别~~后在数据列上换一个列名 '列一 '
所以说同一级别还不能访问列一和列二

原以为select '1 'as '一 ', '2 'as '二 ',一+二 as '三 '~~很好理解~~
理解后再想想为什么用这个和你提的问题关系~~就知道join的一些性质....
可还被你问了回来...

偶不是大师不敢大论join性质~~只有想办法让你用自己方式理解...