select sendconf.id  
from sendconf 
where exists(select jobid from edmsrc  
where sendconf.jobid=edmsrc.jobid and  edmsrc.sendtime<='2007-03-01')select sendconf.id
--max(sendconf.id)
from  sendconf inner join edmsrc on sendconf.jobid=edmsrc.jobid
where edmsrc.sendtime<='2007-03-01'

解决方案 »

  1.   

    我的思路:inner join 的那个,首先形成一张乘积表,这张乘积表的形成早于where 条件的,这样,在这张乘积表中加入where 限制条件,形成一个结果集,然后去形成select 的选项,不知道这种解释是否合理,刚才看了看联机帮助,她的语句优化中,inner join 语句加入了distinct 我也试着给我的加了,结果两个语句形成的结果集一样。验证了我的思路,至少别人推翻我之前我是这样想的,欢迎各位给我个新的见解。
      

  2.   

    我想能有一个高手,请你帮我解释关于这两条语句,SQL的运行机理。谢谢
      

  3.   

    select sendconf.id  
    from sendconf 
    where exists(select jobid from edmsrc  
    where sendconf.jobid=edmsrc.jobid and  edmsrc.sendtime<='2007-03-01')
    这个是取表sendconf的jobid存在于表edmsrc中且edmsrc.sendtime<='2007-03-01'的结果。select sendconf.id
    from  sendconf inner join edmsrc on sendconf.jobid=edmsrc.jobid
    where edmsrc.sendtime<='2007-03-01'
    这个是先取两表中jobid相等的数据,然后再从这些数据中筛选出edmsrc表中的sendtime
    的字段<'2007-03-01'的数据。
      

  4.   

    --不生成笛卡尔积
    select sendconf.id  
    from sendconf 
    where exists(select jobid from edmsrc  
    where sendconf.jobid=edmsrc.jobid and  edmsrc.sendtime<='2007-03-01')
    --生成笛卡尔积
    select sendconf.id
    --max(sendconf.id)
    from  sendconf inner join edmsrc on sendconf.jobid=edmsrc.jobid
    where edmsrc.sendtime<='2007-03-01'从查询结果上来看应该是数据的行数不一样,如果都加上DISTINCT 则结果集会相同