select A.Anane,A.Atel,B.Bname,B.Btel
,(select C.Cname from C where A.Aid=C.Aid)
from A,B
where A.Aid=B.Aid
与
select A.Anane,A.Atel,B.Bname,B.Btel
,C.Cname
from A,B,C
where A.Aid=B.Aid and A.Aid=C.Aid
当然不一样,1的笛卡儿积很大,记录数也比2多。
1的记录数相当于
select A.Anane,A.Atel,B.Bname,B.Btel
from A,B
where A.Aid=B.Aid
乘
(select C.Cname from C where A.Aid=C.Aid)
的记录数
,(select C.Cname from C where A.Aid=C.Aid)
from A,B
where A.Aid=B.Aid
与
select A.Anane,A.Atel,B.Bname,B.Btel
,C.Cname
from A,B,C
where A.Aid=B.Aid and A.Aid=C.Aid
当然不一样,1的笛卡儿积很大,记录数也比2多。
1的记录数相当于
select A.Anane,A.Atel,B.Bname,B.Btel
from A,B
where A.Aid=B.Aid
乘
(select C.Cname from C where A.Aid=C.Aid)
的记录数
可以比较各种标量的值,比如说整数、实数、字符串或者日期等简单的值或者代表这些值的表达式。
实际上子查询扩展了这种观点,允许把整个元组甚至整个关系作为比较的内容!
所以我认为你的第一个查询语句是错误的,子查询应该在where后面!
select A.Anane,A.Atel,B.Bname,B.Btel
,(select C.Cname from C where A.Aid=C.Aid)
from A,B
where A.Aid=B.Aid
应当是错的语句
我刚才看错了。
,(select C.Cname from C where A.Aid=C.Aid)
from A,B
where A.Aid=B.Aid
是我上机验证过的,没有语法错误,而且还可以查处结果来。
select A.Anane,A.Atel,B.Bname,B.Btel
,(select C.Cname from C where A.Aid=C.Aid)
from A,B
where A.Aid=B.Aid这种写法没错我见过,只是很少人这样用,但我也不知这样写有什么好处
select A.Anane,A.Atel,B.Bname,B.Btel
,C.Cname
from A,B,C
where A.Aid=B.Aid and A.Aid=C.Aid
要三个表同时有相同的Aid时才有结果,而在
select A.Anane,A.Atel,B.Bname,B.Btel
,(select C.Cname from C where A.Aid=C.Aid)
from A,B
where A.Aid=B.Aid
中,只要a和b有相同的Aid,查询就有结果
你的两个查询记录数不一样处决于c,如果c包含了b or a的Aid,
就是说这三个表中c是最大的时候,两个查询的记录数是一样的。
建议采用
select A.Anane,A.Atel,B.Bname,B.Btel
,C.Cname
from A,B,C
where A.Aid=B.Aid and A.Aid=C.Aid
简单,明了
如果想取某一表的为基础的数据,可以采用外联
如
select A.Anane,A.Atel,B.Bname,B.Btel
,C.Cname
from A,B,C
where A.Aid=B.Aid(+)
and A.Aid=C.Aid(+)
这样,你的查询的记录数与A的记录数一样