select distinct tsk, userid,getFltByTsk(tsk) flt, getPrepareBeginDate(tsk, userid) begindate, getStdByTsk(tsk) stk,  getPrepareFlag(tsk, userid) prepareflag, getPrepareTime(tsk, userid) preparetime  
 from epare_crewschedule  
 where  (std between to_date('2008-7-12','yyyy-MM-dd') and to_date('2008-7-12', 'yyyy-MM-dd') + 1) 
  and  deptid='二大队' and to_date('2008-7-12','yyyy-mm-dd')<= getStdByTsk(tsk) 
  and (to_date('2008-7-12','yyyy-mm-dd')+1)>= getStdByTsk(tsk)  and position < 50 and getPrepareFlag(tsk, userid)='0'  order by std我不明白的地方是,getFltByTsk(tsk) flt、getPrepareBeginDate(tsk, userid) begindate等等,他们是定义的函数,这里面的tsk和userid等参数,是怎么传进去的啊?!我一开始以为,应该是前面有了select distinct tsk, userid所以后面直接取出这两个值传入函数即可,后来做了一个实验,把tsk, userid去掉了,结果这些还是还是能很好的运行,这到底是怎么回事啊!

解决方案 »

  1.   

    自定义函数传进去不是根据select 的字段啊
    而是根据表里的字段
    和是否select tsk, userid没有关系
    select tsk, userid只是说要显示这两个字段
      

  2.   

    帮你整理下SELECT DISTINCT tsk
                   ,userid
                   ,getfltbytsk(tsk) flt
                   ,getpreparebegindate(tsk, userid) begindate
                   ,getstdbytsk(tsk) stk
                   ,getprepareflag(tsk, userid) prepareflag
                   ,getpreparetime(tsk, userid) preparetime
      FROM epare_crewschedule
     WHERE (std BETWEEN to_date('2008-7-12', 'yyyy-MM-dd') AND
           to_date('2008-7-12', 'yyyy-MM-dd') + 1)
           AND deptid = '二大队'
           AND to_date('2008-7-12', 'yyyy-mm-dd') <= getstdbytsk(tsk)
           AND (to_date('2008-7-12', 'yyyy-mm-dd') + 1) >= getstdbytsk(tsk)
           AND position < 50
           AND getprepareflag(tsk, userid) = '0'
     ORDER BY std这个怎么解释呢,简单说,
    假设epare_crewschedule表有10行数据,
    系统会一行一行判断,如果这行数据满足where后面的条件,
    就把select的列查出来,
    getstdbytsk(tsk)传入的参数就是当前这行的tsk值.
    和select后是否列出来没有关系.
      

  3.   

    哦,明白了一点,但是还有一点不明白,请各位高人看看where条件里面有getprepareflag(tsk, userid) = '0'和getstdbytsk(tsk)
    等等,这里的参数是什么时候进去的呢,按理说,结果集是根据where条件来的,而在where条件中又有了这些需要参数的函数,难不成,SQL在执行时,首先查处所有记录,然后把里面的tsk和userid传入where中的getprepareflag(tsk, userid) 函数,接着再进行一次查询吗?
      

  4.   

    hebo2005已经说得很明白了,这些函数中的参数不是靠传递传进来的,而是你数据库表被便利的当前行中字段的值。
    即使在where中也是一样的。
      

  5.   

    可不可以这么理解
    数据库先执行from子句,找到需要的表(这时表里所有的列都有了)
    然后执行where子句,对表中的记录进行筛选
    然后执行select(当然不考虑你的distinct)
      

  6.   

    哦,是不是就是这样的一个过程:
    首先“指针”指向第一条记录。
    然后,将该条记录中的tsk, userid两个字段的值取出,放到where条件所使用的函数中,接着根据这个where条件进行数据查询。
    最后,当查询出满足条件的记录后,再在select中,把符合条件的记录的tsk, userid字段值取出放入到函数中,形成最后的结果集。