当前位置: 代码迷 >> Oracle开发 >> 初学者级提问,请各位老大看看这条SQL为什么可以执行
  详细解决方案

初学者级提问,请各位老大看看这条SQL为什么可以执行

热度:74   发布时间:2016-04-24 07:36:33.0
菜鸟级提问,请各位老大看看这条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)
  相关解决方案