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)