日期:2014-05-17  浏览次数:20859 次

菜鸟级提问,请各位老大看看这条SQL为什么可以执行
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去掉了,结果这些还是还是能很好的运行,这到底是怎么回事啊!

------解决方案--------------------
自定义函数传进去不是根据select 的字段啊
而是根据表里的字段
和是否select tsk, userid没有关系
select tsk, userid只是说要显示这两个字段
------解决方案--------------------
帮你整理下

SQL code
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

------解决方案--------------------
hebo2005已经说得很明白了,这些函数中的参数不是靠传递传进来的,而是你数据库表被便利的当前行中字段的值。
即使在where中也是一样的。
------解决方案--------------------
可不可以这么理解
数据库先执行from子句,找到需要的表(这时表里所有的列都有了)
然后执行where子句,对表中的记录进行筛选
然后执行select(当然不考虑你的distinct)