SELECT 中何时可以用子查询?

akangcm 2002-11-15 12:10:48
SELECT 中何时可以用子查询?

下面有A,B,C三个表及字段
A(Aid,Aname,Atel)
B(Bid,Bname,Btel,Aid)
C(Cid,Cname,Ctel,Aid)
我用下面2种方式写sql语句,发现执行结果不同。
1.SELECT 中用子查询 ,能查出结果
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

2.SELECT 中不用子查询,不能查出结果
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.SELECT 中何时可以用子查询?
2.因为有时我用上面2种方式查出的结果是相同的,为什么?
3.上面2种方式的SQL有什么区别,哪种方式好?快?
...全文
144 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
penitent 2002-11-15
  • 打赏
  • 举报
回复
晕!!!你是9i吗?
akangcm 2002-11-15
  • 打赏
  • 举报
回复
只取一飘大哥,你没有看错,SELECT后面确实可以跟子查询,这我都验证过了。

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
是我上机验证过的,没有语法错误,而且还可以查处结果来。
penitent 2002-11-15
  • 打赏
  • 举报
回复
子查询可以在fom 后或where后,没有在select 后的
我刚才看错了。
penitent 2002-11-15
  • 打赏
  • 举报
回复
看错了
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
应当是错的语句
jessie0327 2002-11-15
  • 打赏
  • 举报
回复
在最基本的查询语句中,使用的是select from where 语句,where后面的条件
可以比较各种标量的值,比如说整数、实数、字符串或者日期等简单的值或者代表这些值的表达式。
实际上子查询扩展了这种观点,允许把整个元组甚至整个关系作为比较的内容!
所以我认为你的第一个查询语句是错误的,子查询应该在where后面!
penitent 2002-11-15
  • 打赏
  • 举报
回复
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)
的记录数
KingSunSha 2002-11-15
  • 打赏
  • 举报
回复
在8I或以上版本中,在SELECT中使用子查询是合法的,但是我不喜欢这么写
zpwly 2002-11-15
  • 打赏
  • 举报
回复
学习
penitent 2002-11-15
  • 打赏
  • 举报
回复
还有,我的第一贴是错的,我当时是看错了你的写法,
你的两个查询记录数不一样处决于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的记录数一样



penitent 2002-11-15
  • 打赏
  • 举报
回复
你的记录数不一样的原因是
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,查询就有结果
penitent 2002-11-15
  • 打赏
  • 举报
回复
我试了一下
在8i中就可以了,8不可以。
怎么有这么种用法,没有见过,呵呵。
也只怪我没有用过这种用法,都是用8用的太多的恶果
yuxuan 2002-11-15
  • 打赏
  • 举报
回复
可以在select 之后,我试过
liucm 2002-11-15
  • 打赏
  • 举报
回复

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

这种写法没错我见过,只是很少人这样用,但我也不知这样写有什么好处

17,377

社区成员

发帖
与我相关
我的任务
社区描述
Oracle 基础和管理
社区管理员
  • 基础和管理社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧