结果数量为什么不同?

cqgaoke 2006-11-02 04:19:02
select *from smtopm where exists (SELECT smtopm.item_key FROM smtopm inner join iir on trim(iir.itm_key)=trim(smtopm.item_key));

SELECT smtopm.item_key FROM smtopm inner join iir on trim(iir.itm_key)=trim(smtopm.item_key);
为什么不同,难道这里的EXISTS有问题吗?


FUCK oracle
...全文
182 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
cqgaoke 2006-11-03
  • 打赏
  • 举报
回复
to dobetterthatnthink(如果你没有那么多的选择) ( ) 信誉:100:为什么exists的条件总是返还true?
多壮志 2006-11-03
  • 打赏
  • 举报
回复
前后两个语句等同于:
1)select *from smtopm ,因为exists的条件总是返还true.
2)SELECT smtopm.item_key FROM smtopm inner join iir on trim(iir.itm_key)=trim(smtopm.item_key); 这个和最普通的是一样的,inner不还是不inner是没有区别的。
所以在有记录的情况下,通常后者返回的和前者的是不一样的。
这个是因为你没有了解exists,并且你的exists条件可能不是你需要的。
oracle有问题,但是不至于在这个方面出现。
komushi 2006-11-03
  • 打赏
  • 举报
回复
lz同志,你的第一句明显写错了,你多连接了一次smtopm。
第二句你也应该去掉多余数据。

试试看我这个,我这里假设了item_key是unique的:
1.select smtopm.item_key from smtopm
where exists (SELECT * FROM iir where trim(iir.itm_key)=trim(smtopm.item_key));

2.SELECT smtopm.item_key FROM smtopm inner join iir on trim(iir.itm_key)=trim(smtopm.item_key) group by smtopm.item_key;

说实话oracle比mssql好用多了,sql2005才开始支持一些analytic function,而且一直觉得sqlserver deadlock问题严重,设计数据库很麻烦。别骂oracle拉!
多壮志 2006-11-03
  • 打赏
  • 举报
回复
exists的解释: 当subquery返回的rows》=1的时候,exists返还true.
你执行以下你的subquery就知道返还的rows》=1,因为总是1,总是true,所以等同于没有用
cqgaoke 2006-11-02
  • 打赏
  • 举报
回复
不是的,记录绝对没有重复,所以我想这到底是为什么呢,因为ORACLE和MS-SQL很不一样的.
子陌红尘 2006-11-02
  • 打赏
  • 举报
回复
两个表的关联记录存在多对多的关系,两个不同逻辑的SQL查询出来的结果自然不同。

后一个查询的结果存在重复的情况

17,086

社区成员

发帖
与我相关
我的任务
社区描述
Oracle开发相关技术讨论
社区管理员
  • 开发
  • Lucifer三思而后行
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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