求助:一个sql的写法,可能是很常见的,但是不知道如何修改

seesea10523 2008-03-25 04:19:33
我有个需求是这样的:
A B两个表
A和B是一对多外键关系
A的主键是aid同时也是B的外键,B的主键是bid
我现在要取A表中没有在B表出现

我的 sql是:
第一种
select a.aid
from A a
where a.aid not in (select aid from B)

这个因为A B表数量大,太慢。

第二种
select a.aid
from A a,B b
where A.aid=B.aid(+)
and B.bid is null

这个好像倒是挺快的,但是我不确定对不。

第三种
select a.aid
from A a
where a.aid not in (select aid from B where aid=a.aid)

高手指点下。数据量比较大。不知道该怎么写才好呀。
第二种不确定是不是正确呀。查的结果是一样的。
...全文
115 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
SmartFool 2008-03-26
  • 打赏
  • 举报
回复
第二种方法是对的。
左外连接如果不匹配的话,ORACLE会自动赋一个null值。
所以当b.bid=null就找出了在A表而B表中没有的。
zaib2007 2008-03-25
  • 打赏
  • 举报
回复
select sid from B
minus
select sid from A

得到a中没有的sid
sishenyu 2008-03-25
  • 打赏
  • 举报
回复
实现的方法很多,个人建议用not exists,在数据很多的时候还是比较快的,not in 的话是比较慢的
jackyhelen 2008-03-25
  • 打赏
  • 举报
回复
第二种是对的哦,多表连接的里的左连接的嘛,没错撒
HelloWorld_001 2008-03-25
  • 打赏
  • 举报
回复
2是有这种写法的,我认为是对的,说了可能出错的原因了,
你这用是没问题的

2效率最高
seesea10523 2008-03-25
  • 打赏
  • 举报
回复
因为第二种写法明显很快,如果没错我就选择这个了。
高手给讲讲呀。
seesea10523 2008-03-25
  • 打赏
  • 举报
回复
错在哪里呀?能不能具体说下。
我跑了几次总数都是一致的。
很郁闷呀。

第二种写法是我自己乱写的,但是我想左联之后B表没有的数据就是B的id为空了。
HelloWorld_001 2008-03-25
  • 打赏
  • 举报
回复
我感觉2是对的,
select count(*) from b where bid is null //记录是0就是对的

你这个是主件不会是null
seesea10523 2008-03-25
  • 打赏
  • 举报
回复
你的方法好像还是没第二种方法快呀。
就是不知道第二种写法有问题不
baojianjun 2008-03-25
  • 打赏
  • 举报
回复
第二种写法錯誤

一般情況下 NOT EXISTS 比NOT IN 的速度要快 (但也不決對)
seesea10523 2008-03-25
  • 打赏
  • 举报
回复
能不能分析下原因,我是菜鸟。看不太懂呀。:)
还有就是第二种写法对不对呀?
谢谢指点!
baojianjun 2008-03-25
  • 打赏
  • 举报
回复
select a.aid
from A a
where not exists
(select 'x' from b
where a.aid = b.aid )

17,377

社区成员

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

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