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

解决方案 »

  1.   

    两个表的关联记录存在多对多的关系,两个不同逻辑的SQL查询出来的结果自然不同。后一个查询的结果存在重复的情况
      

  2.   

    不是的,记录绝对没有重复,所以我想这到底是为什么呢,因为ORACLE和MS-SQL很不一样的.
      

  3.   

    前后两个语句等同于:
      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有问题,但是不至于在这个方面出现。
      

  4.   

    to dobetterthatnthink(如果你没有那么多的选择) ( ) 信誉:100:为什么exists的条件总是返还true?
      

  5.   

    exists的解释: 当subquery返回的rows》=1的时候,exists返还true.
    你执行以下你的subquery就知道返还的rows》=1,因为总是1,总是true,所以等同于没有用
      

  6.   

    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拉!