很简单的SQL语句句问题

WZCNet 2004-05-14 11:00:45
现在有a,b两个表,a是主表共有3万条数据,b是个从表共有7万条数,
现在用select * from a,b where b.id= a.id 选择出来是7万条,但我只想要3万条数据,至于b表中要从那一条数据都一样只要能有一条就可以。
请各位帮忙。
...全文
45 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
marinedalian2 2004-05-14
  • 打赏
  • 举报
回复
to:Petergepeter(拔刀斋) ( ) 信誉:100 2004-05-14 11:14:00 得分:0


select * from a,b where a.id= b.id(+)

你这样的结果是a.id = b.id 再加上 a.id 当中不等于b.id 的值与空值结合的数据。

所以你的结果肯定大于
select * from a,b where b.id= a.id 选择出来是7万条。



zhenyelchong 2004-05-14
  • 打赏
  • 举报
回复
外连接
就如楼上2位的
skystar99047 2004-05-14
  • 打赏
  • 举报
回复
select * from b,a where b.id(+)=a.id;
Petergepeter 2004-05-14
  • 打赏
  • 举报
回复
select * from a,b where a.id= b.id(+)
marinedalian2 2004-05-14
  • 打赏
  • 举报
回复
TO:
snowy_howe(天下有雪)
果然不错。
请教:
如果不是主从表呢?
snowy_howe 2004-05-14
  • 打赏
  • 举报
回复
既然是主从表,那么认为a表中有记录的不一定在b表中存在,而b表中存在
的id一定在a表存在,不然叫什么主从表。
假设id为主键
select a.id,max(a.col1)...,max(b.col1),max(b.col2) from a,b
where a.id = b.id(+) group by a.id;
既然随便取一条,那么就取最大的一条。
注意:如果主键有几个,需要在group by后面加。
由于在a表中用的是主键分组,那么max(a.col1)=a.col1不影响的。
而主从表表示a表一条记录对应b表多条记录,所以max会将其他
记录去掉。
marinedalian2 2004-05-14
  • 打赏
  • 举报
回复
补充一下:
刚才的我取得b表的第一条记录与a表进行外连接, 这样有可能连接后取不到b表中的纪录。
因为b表的第一条记录的id在a表中不一定存在。

重做如下:
取a与b相等的记录中b的最大rowid。这样保证只取出一条记录。而且这条记录的id在a表里存在。
然后用b表的这一条记录与a表作外连接:
select * from a,(select * from b where rowid=(select max(b.rowid) from a,b where a.id=b.id )) x where a.id= x.id(+)
/
得出结果 3 万条记录。

zhenyelchong 2004-05-14
  • 打赏
  • 举报
回复
select * from song_main;

ID NAME
------ --------------------
1 a
2 b
3 c

select * from song_det;

ID NAME
------ --------------------
1 H
2 H
3 H
1 G
2 G
3 G
1 F

比较笨的方法!(主_从表不太了解,哈哈)
select * from song_main a,(select id,name from (select id,name,rank() over(partition by id order by name )m from song_det)
where m=1) b
where a.id=b.id(+)
/
其中song_main是主表,song_det是从表,楼主试试!
每个表都只有id,name2个字段
或许有参考价值!!

marinedalian2 2004-05-14
  • 打赏
  • 举报
回复
我理解你题意是:
想要a表中的每一条记录与b表中的任一条记录外连接即可:

我的结果是这样的,你可以试试:(我做过测试了)
select * from a,(select * from b where rownum=1) x where a.id= x.id(+)
/

zhaokeke2004 2004-05-14
  • 打赏
  • 举报
回复
select * from a,b where a.id= b.id (+)
a表中的内容会全部显示
sy_315 2004-05-14
  • 打赏
  • 举报
回复
使用外联接
select * from a,outer b where a.id=b.id
zhenyelchong 2004-05-14
  • 打赏
  • 举报
回复
承认错误!!
那么做,好象 是不行!!
再想想!!
marinedalian2 2004-05-14
  • 打赏
  • 举报
回复
To: skystar99047(天星) ( ) 信誉:100 2004-05-14 12:21:00 得分:0

select * from b,a where b.id(+)=a.id;

你得这样的结果, 是b.id=a.id的纪录。 再加上b.id (7万条)中不等于a.id的记录与空值
结合的结果。 即, b中的记录肯定都会选中。 也就是至少是7万条记录。


17,377

社区成员

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

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