匪夷所思的SQL语句问题???

[复制链接]
查看11 | 回复3 | 2014-2-19 11:55:14 | 显示全部楼层 |阅读模式
有一个语句
SELECT * FROM
(SELECTPAAF.PERSON_ID M_PERSON_ID ,
PAPF.LAST_NAME,PAPF.EMPLOYEE_NUMBER,
TO_CHAR(PAPF.DATE_OF_BIRTH,'YYYY-MM-DD') DATE_OF_BIRTH,
DECODE('F',PAPF.SEX,'女','男') SEX,
PAPF.REGION_OF_BIRTH JG,
PAPF.ATTRIBUTE1 MZ,
PAP.NAME POS_NAME,
HOU.NAME OU_NAME
FROM PER_ALL_ASSIGNMENTS_F PAAF,PER_ALL_PEOPLE_F PAPF,HR_ORGANIZATION_UNITS HOU,PER_ALL_POSITIONS PAP
WHEREPAAF.PRIMARY_FLAG='Y'
AND HOU.ORGANIZATION_ID=PAAF.ORGANIZATION_ID AND PAAF.POSITION_ID =PAP.POSITION_ID(+)
AND (SYSDATE) BETWEENPAPF.EFFECTIVE_START_DATE AND PAPF.EFFECTIVE_END_DATE
AND (SYSDATE) BETWEENPAAF.EFFECTIVE_START_DATE AND PAAF.EFFECTIVE_END_DATE
AND PAAF.PERSON_ID=PAPF.PERSON_ID
--ANDPAAF.PERSON_ID BETWEEN 2826 AND 2827
) S01 ,
(SELECT PPA.PERSON_ID,
TO_CHAR(PPA.DATE_FROM ,'YYYY-MM-DD') ZZMM_DATE_FROM ,
PPA.DATE_TO ZZMM_DATE_TO,PAC.SEGMENT1 ZZMM
FROM PER_PERSON_ANALYSES PPA,
PER_ANALYSIS_CRITERIA PAC,
PER_SPECIAL_INFO_TYPES_v PSIV
WHEREPSIV.NAME='政治面貌' AND PAC.ID_FLEX_NUM=PSIV.ID_FLEX_NUMANDPPA.ANALYSIS_CRITERIA_ID=PAC.ANALYSIS_CRITERIA_ID
AND PPA.DATE_FROM=(SELECT MAX(PPA2.DATE_FROM)

From PER_PERSON_ANALYSES PPA2,

PER_ANALYSIS_CRITERIA PAC2

WHERE

PAC2.ID_FLEX_NUM=PAC.ID_FLEX_NUM

AND PPA2.ANALYSIS_CRITERIA_ID=PAC2.ANALYSIS_CRITERIA_ID

AND PPA.PERSON_ID=PPA2.PERSON_ID

GROUP BY PPA2.PERSON_ID)--政治面目
) S02
where s01.M_PERSON_ID =s02.PERSON_ID(+)

这样运行需要6秒,但是如果加上trunc函数变成
trunc (SYSDATE) BETWEENPAPF.EFFECTIVE_START_DATE AND PAPF.EFFECTIVE_END_DATE
AND trunc (SYSDATE) BETWEENPAAF.EFFECTIVE_START_DATE AND PAAF.EFFECTIVE_END_DATE
运行时间就变成未知数了,反正我是没等到它出来结果过,
但现在如果不加trunc 那么就会少计算一天,是不对的,这是怎么回事???
回复

使用道具 举报

千问 | 2014-2-19 11:55:14 | 显示全部楼层
怎么会少计算一天呢?
SQL> select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss') from dual;
TO_CHAR(SYSDATE,'YY
-------------------
2003-03-27 20:32:11
1* select to_char(trunc(sysdate),'yyyy-mm-dd hh24:mi:ss') from dual
SQL> /
TO_CHAR(TRUNC(SYSDA
-------------------
2003-03-27 00:00:00
trunc只是当天最小的时间,
你说的这种子情况,很可能是你写的EFFECTIVE_START_DATE 数据的时间也是00:00:00,如果
是具体的时间,用sysdate就可以,不用trunc。
回复

使用道具 举报

千问 | 2014-2-19 11:55:14 | 显示全部楼层
说得好,支持。
贴太长的SQL文只能表明你缺乏分析问题的能力,抓不住重点或是懒于思考。
回复

使用道具 举报

千问 | 2014-2-19 11:55:14 | 显示全部楼层
赞成
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行