Q&A

  • 서브쿼리 에러
델파이 5.0에 SQL2000server를 사용하여 프로그램을 짜 보았지만
" invalid use keyword. Token : select Line Number 7"이라는 에러가 발생하네요. 똑같은 문장으로 SQL Explore에서 돌려보면 원하는 결과치를 얻을 수 있습니다. .
서브쿼리를 사용하면 속도가 늦어 진다는데 보통 몇개까지 사용할 수 있는지요. (혹시 서브쿼리를 8개나 사용해서 그런건 아닌지....)

(프로그램 내용)
with Query1.SQL do
begin
         Clear;
         Add('select si_code, si_name, ');
         Add('IsNull(T11.Busu,0)+IsNull(T21.Busu,0)+IsNull(T31.Busu,0), ');
         Add('IsNull(T11.Kum,0)+IsNull(T21.Kum,0)+IsNull(T31.Kum,0), ');
         Add('IsNull(T12.Busu,0)+IsNull(T22.Busu,0)+IsNull(T32.Busu,0), ');
         Add('IsNull(T12.Kum,0)+IsNull(T22.Kum,0)+IsNull(T32.Kum,0), ');
         Add('T4.Kum, T5.Kum From '+SName+', ');

         Add('(select osi_scode Code, sum(osi_su) Busu, su(osi_net)       Kum From '+OName1);
         Add(' where osi_eyy+osi_emm+osi_edd <= '+Buf_Day+' and ');
         Add('osi_scode >= ''8900'' and osi_scode <= ''8999'' and osi_sec2 = ''1''');
         Add(' group by osi_scode) T11, ');

         Add('(select osi_scode Code, sum(osi_su) Busu, sum(osi_net) Kum From '+OName1);
         Add(' where osi_eyy+osi_emm+osi_edd <= '+Buf_Day+' and ');
         Add('osi_scode >= ''8900'' and osi_scode <= ''8999'' and osi_sec2 = ''2''');
         Add(' group by osi_scode) T12, ');

         Add('(select osi_scode Code, sum(osi_su) Busu, sum(osi_net) Kum From '+OName2);
         Add(' where osi_eyy+osi_emm+osi_edd <= '+Buf_Day+' and ');
         Add('osi_scode >= ''8900'' and osi_scode <= ''8999'' and osi_sec2 = ''1''');
         Add(' group by osi_scode) T21, ');

         Add('(select osi_scode Code, sum(osi_su) Busu, sum(osi_net) Kum From '+OName2);
         Add(' where osi_eyy+osi_emm+osi_edd <= '+Buf_Day+' and ');
         Add('osi_scode >= ''8900'' and osi_scode <= ''8999'' and osi_sec2 = ''2''');
         Add(' group by osi_scode) T22, ');

         Add('(select osi_scode Code, sum(osi_su) Busu, sum(osi_net) Kum From '+OName3);
         Add(' where osi_eyy+osi_emm+osi_edd <= '+Buf_Day+' and ');
         Add('osi_scode >= ''8900'' and osi_scode <= ''8999'' and osi_sec2 = ''1''');
         Add(' group by osi_scode) T31, ');

         Add('(select osi_scode Code, sum(osi_su) Busu, sum(osi_net) Kum From '+OName3);
         Add(' where osi_eyy+osi_emm+osi_edd <= '+Buf_Day+' and ');
         Add('osi_scode >= ''8900'' and osi_scode <= ''8999'' and osi_sec2 = ''2''');
         Add(' group by osi_scode) T32, ');

         Add('(select substring(cms_code,4,4) Code, sum(Cms_kum) Kum From '+IName);
         Add(' where cms_day < '+Buf_Day+' and ');
         Add('substring(cms_code,4,4) >= ''8900'' and substring(cms_code,4,4) <= ''8999''');
         Add(' group by substring(cms_code,4,4)) T4, ');

         Add('(select substring(cms_code,4,4) Code, sum(Cms_kum) Kum From '+IName);
         Add(' where cms_day = '+Buf_Day+' and ');
         Add('substring(cms_code,4,4) >= ''8900'' and substring(cms_code,4,4) <= ''8999''');
         Add(' group by substring(cms_code,4,4)) T5 ');

         Add(' where si_code = T11.Code and si_code = T12.Code and si_code = T21.Code');
         Add(' and si_code = T22.Code and si_code = T31.Code and si_code = T32.Code');
         Add(' and si_code = T4.Code and si_code = T5.Code');
      end;
      Query1.Open;
3  COMMENTS
  • Profile
    sds 2003.02.19 21:27
    해결이 되었다니 다행이지만...
    " invalid use keyword. Token : select Line Number 7"
    지금 난 오류는 SQL구문 오류인듯한데요..
    7번째 줄에 보면
    이렇게 되어있는데..
    sum을 잘못입력하신거 같네요..^^




  • Profile
    열심히 2003.02.19 03:29
    ??

    서브쿼리를 써서 오픈을 하면 모든경우에 그런지는 모르겠지만

    님과 같은 에러가 나면서 델파이에서만..open이 안되는 경우가 저도 있었습
    니다..저는 델파이4를 쓰고 있지만..

    높은 버젼에서는 안이럴라나?

    이럴땐 전 updateSQL을 붙이니깐 안나더라구요...

    그리고 속도가 늦어지는건 서브쿼리를 써서가 아니라

    여러개의 쿼리를 날리기 떄문이죠..

    조인을 해서 쓴다면 각 테이블 마다 조인 조건이나(인덱스에 영향)

    일반 조건을 주어 점차 조인 되는 레코드수가 적어져서 효율적이지요..

    in-Line-view라고 하지요..??쿼리를 날려서 각각의 서브쿼리에 대한 in-line-view를 만든다음 조인을 하신다고 보면 됩니다..

    이래서 늦어지는 것이지요..
    서버의 리소스도 많이 잡아 먹겠죠??

    왠만한 통계 테이블 아니면 잘 안쓰게 되죠...

    결론은 안쓰는게 좋습니다..서브 쿼리가 좋은 성능을 나타낼때도 있나??

    아무래도 있을지 모르니 상황에 따라서 잘판단을....


  • Profile
    Wookey 2003.02.19 19:15
    열심히님의 답변으로 문제가 해결되었습니다.
    updateSQL을 붙이니깐 정말 신기하게 되는군요. .
    벌써 두번이나 님의 도움을 받았습니다.
    정말 고맙습니다. <<^유^>>