with qryTemp do
begin
Close;
SQL.Clear;
SQL.Add( 'SELECT CONT_NO, NAME, RFC_NO, IMSS_NO, D311, D313, ' );
SQL.Add( 'CATE_CODE, OCCUP_CODE, HOURS, DAY_WAGE, INTE_WAGE ' );
SQL.Add( 'FROM HRCS_CONTRACT C, ( ' );
SQL.Add( 'SELECT CARD_TAG, SUM(OT) HOURS ' );
SQL.Add( 'FROM HRCS_WORK ' );
SQL.Add( 'WHERE WORK_DATE >= :START_DAY ' );
SQL.Add( 'AND WORK_DATE <= :END_DAY ' );
SQL.Add( 'GROUP BY CARD_TAG ' );
SQL.Add( ') W ' );
SQL.Add( 'WHERE C.CARD_TAG = W.CARD_TAG ' );
SQL.Add( 'AND HOURS > 0' );
ParambyName( 'START_DAY' ).AsDate := pdtStart_Day;
ParambyName( 'END_DAY' ).AsDate := pdtEnd_Day;
Open;
end;
이것을 실행하면
Project hrcs.exe raised exception class EDBEngineError
with message 'Invalid use of keyword. Token : SELECT
Line Number : 4'.
그런데 SQL*Plus 와 SQL Explorer에서
위와 같이 쿼리하면 잘 됩니다..
원인이 뭐죠?
> with qryTemp do
> begin
> Close;
> SQL.Clear;
> SQL.Add( 'SELECT CONT_NO, NAME, RFC_NO, IMSS_NO, D311, D313, ' );
> SQL.Add( 'CATE_CODE, OCCUP_CODE, HOURS, DAY_WAGE, INTE_WAGE ' );
> SQL.Add( 'FROM HRCS_CONTRACT C, ( ' );
> SQL.Add( 'SELECT CARD_TAG, SUM(OT) HOURS ' );
> SQL.Add( 'FROM HRCS_WORK ' );
> SQL.Add( 'WHERE WORK_DATE >= :START_DAY ' );
> SQL.Add( 'AND WORK_DATE <= :END_DAY ' );
> SQL.Add( 'GROUP BY CARD_TAG ' );
> SQL.Add( ') W ' );
> SQL.Add( 'WHERE C.CARD_TAG = W.CARD_TAG ' );
> SQL.Add( 'AND HOURS > 0' );
> ParambyName( 'START_DAY' ).AsDate := pdtStart_Day;
> ParambyName( 'END_DAY' ).AsDate := pdtEnd_Day;
> Open;
> end;
>
자세히 보시면 서브쿼리 위치가 잘못되었습니다.
FROM 절에 나오는것이 아니라 where 절에서 나와야지요..
그래서 서브쿼리할때 SELECT 가 잘못되었다고 합니다.
그럼..