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去掉了,结果这些还是还是能很好的运行,这到底是怎么回事啊!
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 tsk, userid没有关系
select tsk, userid只是说要显示这两个字段
,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后是否列出来没有关系.
等等,这里的参数是什么时候进去的呢,按理说,结果集是根据where条件来的,而在where条件中又有了这些需要参数的函数,难不成,SQL在执行时,首先查处所有记录,然后把里面的tsk和userid传入where中的getprepareflag(tsk, userid) 函数,接着再进行一次查询吗?
即使在where中也是一样的。
数据库先执行from子句,找到需要的表(这时表里所有的列都有了)
然后执行where子句,对表中的记录进行筛选
然后执行select(当然不考虑你的distinct)
首先“指针”指向第一条记录。
然后,将该条记录中的tsk, userid两个字段的值取出,放到where条件所使用的函数中,接着根据这个where条件进行数据查询。
最后,当查询出满足条件的记录后,再在select中,把符合条件的记录的tsk, userid字段值取出放入到函数中,形成最后的结果集。