Q&A

  • [질문] outer Join 한 후에 SQL 에러 문제
제가 개념이 부족해서 왜 틀리는지 알 수가 없어서 다시 한번 고수님들께 질문 올려봅니다.
참고로 access 2007 DB 를 사용하고 ADO 로 연결합니다.

TABLE member

Phone (char) 12 - PK
Name (char) 20 - 공백허용
CarNo (char) 10 - 공백허용
Pref (memo) - 공백허용
reg_date (date)

TABLE  Point (공백 허용 필드 없음)

phone (char) 12
point1 (int)
point2 (int)
...


위의 두 테이블을 조인해서 point1,2 에 sum 을 해서 보여주려고 하는데 에러가 나는군요.
member 테이블에서 name 필드가 공백인 레코드가 몇개 있습니다.

-- SQL 문 --

select a.phone, a.name, a.carNo, a.pref, sum(b.point1), sum(b.point2)
from member a left outer join point b on a.point = b.point
group by a.phone

aDOquery 컴포넌트를 사용해서 dbgrid 와 에디터에 나눠서 보여주려고 하는데..
위의 SQL 문만 실행하면  에러가 나는군요.

"지정된 'name' 식을 계산함수의 일부로 포함하지 않는 쿼리를 실행하려 하였습니다"

이게 무슨 뜻인지도 모르겠네요..

SQL 문 어디가 잘못된 걸까요?

[P.S] select * 로 하고, group by 문을 지우면 에러가 안나고 실행이 되는 걸로 봐서 sum 이 문제일까요?
8  COMMENTS
  • Profile
    cell 2008.12.10 22:12
    group by a.phone, a.name, a.carNo, a.pref

    이렇게 하셔야 위의 SQL이 동작할거 같습니다.
  • Profile
    cell 2008.12.10 22:22
    자세한 내용은 모르겠지만 point 와 point 로 조인을 하면 제대로 된 데이터가 나오나요?
    같은 포인트가 여러건 있음 엉뚱한 결과가 나올텐데요... a.phone로 하셔야 될듯한데요.

    제가 한다면 아래와 같이 할거 같아요.


    select a.phone, max(a.name) as name, max(a.carNo) as carno, max(a.pref) as pref, sum(b.point1), sum(b.point2)
    from member a left outer join point b on a.phone= b.phone
    group by a.phone


  • Profile
    델파이쌩초보 2008.12.10 23:26
    헉.. 빠른 답변 감사드립니다.

    그리고 제가 글을 쓰는 중에 카피를 잘못했군요.. ㅡㅡ;; (죄송합니다)

    from member a left outer join point b on a.point = b.point 가 아니라 a.phone = b.phone 이었네요..

  • Profile
    델파이쌩초보 2008.12.10 23:48
    그런데 가르쳐주신대로 SQL 문을 바꿔서 해보니까...

    계산인수 (a.pref)에 메모나 OLE, 하이퍼링크 개체 필드를 사용할 수 없습니다.

    라고 나오네요..

    메모필드에 max 를 지우면 계산함수의 일부로 포함하지 않는 쿼리를 실행한다는 에러가 나오고요
  • Profile
    델파이쌩초보 2008.12.11 00:06
    sum 부분 두개 필드를 제외하고 나머지 select 필드를 몽땅 group by 로 묶으니 에러는 안나네요..

    근데 문제는 그렇게 하고 나니 리스트가 그냥 몽땅 다 뿌려지네요..

    제가 원하는 결과는..

    phone, name, carNo, pref, point1의 합산, point2 의 합산

    이런 식인데..

    다 group by 로 묶으니 같은 phone 에 대해서도

    phone, name, carNo, pref, point1, point2
    phone, name, carNo, pref, point1, point2
    phone, name, carNo, pref, point1, point2
    phone, name, carNo, pref, point1, point2

    이런식으로 줄줄이 나오네요..
  • Profile
    cell 2008.12.11 00:21
    메모 타입은 MAX를 허용하지 않네요.



    select a.phone, max(a.name) as name, a.carNo, (Select pref from member c where a.phone = c.phone ) as pref, sum(b.point1), sum(b.point2)
    from member a left outer join point b on a.phone= b.phone
    group by a.phone



    이렇게 하면 될듯하네요..
  • Profile
    델파이쌩초보 2008.12.11 03:46
    cell님 답변 해 주시느라고 너무 고생하셨는데.. 제가 너무 미안해서 더 이상 질문하기도 죄송합니다.

    음.. 결과적으로 잘 안되는 거 같네요.. access DB 라서 그런건지...
    제 생각에는 sum(a.point1), sum(a.point2) 이게 select 문에 들어가서 문제가 되는 것 같다는 생각인데요.. (맞나? ㄷㄷ)

    sum(a.point1) 대신에 "cell" 님의 말씀에서 힌트를 얻어서 서브쿼리를 넣어봤는데도 원하는 결과는 안나와서..
    결국 DBGrid 를 포기하던지.. DBGrid 를 하나 더 만들어서 sum 은 따로 출력을 할까도 했는데 데이타가 매치가 잘 안되는 거 같아서.. 쩝

    그냥 무식하게 DBGrid 를 쓰지말고 다 에디터 처리를 할까요? 에디터 하나에 쿼리 하나씩.. ? ;;;;;

    그리고 문득 든 생각인데 쿼리 문에다 줄줄이 서브쿼리를 넣으면 데이타가 많아졌을때 시간이 많이 걸리지 않을까요?
    흐음.. 여하간 도와주셔서 감사합니다.

    저는 문제해결을 위해서 고민하러.. 뿅~ ㅜㅜ;;;;
  • Profile
    델파이쌩초보 2008.12.11 06:37

    아.. cell 님 해결했습니다. 정말 감사합니다.

    ADOQuery 로 SQL을 써서 날렸을 당시에는, DBGrid 에서 칼럼지정을 할 때 sum(point1), sum(point2) 부분의 필드명이 expr1001, expr1002 로

    되어서 그걸 선택을 해서 설정을 했었는데, MS Access 에서 직접 cell 님이 알려주신 쿼리문으로 쿼리를 작성해서 저장을 하고 나니,

    DBGrid 의 FieldName 선택하는 란에 "point1의 합계", "point2의 합계" 라고 필드명이 바뀌어 버렸었군요.

    그 필드명으로 칼럼 지정을 하니까 잘 나옵니다.

    그래서 무난히 원하는 결과값을 얻을 수 있었습니다. (이해는 잘 안가지만 어쨋든.. ^^)

    cell 바쁘신 시간 쪼개서 우매한 질문에 정성껏 답해주셔서 정말 감사드립니다.

    덕분에 SQL 공부 많이 했습니다. ^^

    건강 조심하시고 좋은 일만 있으시기를 바라겠습니다.

    그럼.. ^^

    • 구창민
      2008.12.11 21:48
      안녕하세요.. size 라는 변수하나 만드셔서 GetDataSize로 크기를 읽어오신후 해보세요.. 대충 고...
    • 하늘사랑
      2008.12.11 22:11
      답변 너무감사드립니다 ^^ 답변해주신 부분을 수정해서 해보았는데요 type에러는 발생하지 않았습니다. ...
    • 박상윤
      2008.12.24 22:22
      SetLength(buffer,Size); objReg.ReadBinaryData('test', Pointer(buffer^), size); //<- 데이타 ...
    • 하늘사랑
      2008.12.27 03:24
      박상윤님 늦게 봤내요 ^^ 답변감사드립니다 ^^
    • 조일현
    • 2008.12.11 16:17
    • 6 COMMENTS
    • /
    • 0 LIKES
    • 장성호
      2008.12.11 21:09
      단순히 ComboBox의 내용을 text 파일에 저장하는것은 님이 하신 방법을 하면 문제 없을듯 한데요.. ...
    • 조일현
      2008.12.12 02:58
      답변해 주셔서 감사합니다. 아래꺼 사이트는 접속이 안되네용 그런데 요지가 살짝 빗나간것 같아요 ...
    • 최용일
      2008.12.12 03:59
      ComboBox1.Items.SaveToFile('1.txt'); 잘 저장되었을겁니다. 단지 님께서 저장된 위치를 찾을 수 없었...
    • 조일현
      2008.12.12 05:51
      네 답변 감사합니다.. 최용일님 말씀대로 위치 지정을 했습니다. 그런데 저장이 다시 되긴 해도 콤보박...
    • 최용일
      2008.12.12 06:14
      글쎄요... 어떻게 코딩하셨는지 제가 알 수가 없어서... 뭐라 말씀드리기 힘드네요... 추측컨데... 콤...
    • 조일현
      2008.12.12 06:48
      아~! 정말 감사합니다. 아이템과 텍스트를 착각하고 있었네요 덕분에 문제가 풀렸어요~ ^^
    • 허수진
    • 2008.12.11 03:16
    • 3 COMMENTS
    • /
    • 0 LIKES
    • 장성호
      2008.12.11 06:12
      openpictureDialog 는 파일 읽는것과 전혀 관계가 없습니다. OpenDilaog를 포함하여 모든 Dia...
    • 최용일
      2008.12.11 06:50
      위에 답변도 맞지만... uses절에 JPEG유닛만 추가해주시면 질문하신 코드를 손대지 않아도 해결됩니다. ...
    • 허수진
      2008.12.11 17:51
      감사합니다^^* 해결되었네요~!! 델파이 앞으로도 많이 공부해야겠어요. 항상 수고하세요~
    • 최용일
      2008.12.12 02:19
      당연히 for문 등의 반복문을 사용해야죠... LastCell이라고 해도 눈으로 보이는 것과는 차이가 있을 ...
    • 호호호호
      2008.12.12 06:07
      ㅋㅋ 감사합니다. ㅋㅋ 문제가 잘 해결 되었습니다. ^^ 좋은 하루 되세요
    • 이건희
    • 2008.12.11 01:55
    • 0 COMMENTS
    • /
    • 0 LIKES
    • 사다리
    • 2008.12.10 23:21
    • 2 COMMENTS
    • /
    • 0 LIKES
    • 장성호
      2008.12.11 01:48
      서비스 프로그램에서 감시할 프로그램이 윈도우 어플리케이션 인가요? 서비스 플로그램은 Window Serv...
    • 사다리
      2008.12.11 19:05
      조은 답변 감사 드립니다~ㅎㅎ 오늘 하루도 즐거운 하루 되세요~ㅎㅎ
    • cell
      2008.12.10 22:12
      group by a.phone, a.name, a.carNo, a.pref 이렇게 하셔야 위의 SQL이 동작할거 같습니다.
    • cell
      2008.12.10 22:22
      자세한 내용은 모르겠지만 point 와 point 로 조인을 하면 제대로 된 데이터가 나오나요? 같은 포인트가...
    • 델파이쌩초보
      2008.12.10 23:26
      헉.. 빠른 답변 감사드립니다. 그리고 제가 글을 쓰는 중에 카피를 잘못했군요.. ㅡㅡ;; (죄송합니다)...
    • 델파이쌩초보
      2008.12.10 23:48
      그런데 가르쳐주신대로 SQL 문을 바꿔서 해보니까... 계산인수 (a.pref)에 메모나 OLE, 하이퍼링크 개...
    • 델파이쌩초보
      2008.12.11 00:06
      sum 부분 두개 필드를 제외하고 나머지 select 필드를 몽땅 group by 로 묶으니 에러는 안나네요.. 근데...
    • cell
      2008.12.11 00:21
      메모 타입은 MAX를 허용하지 않네요. select a.phone, max(a.name) as name, a.carNo, (Select pr...
    • 델파이쌩초보
      2008.12.11 03:46
      cell님 답변 해 주시느라고 너무 고생하셨는데.. 제가 너무 미안해서 더 이상 질문하기도 죄송합니다. ...
    • • • •
    • 허수진
    • 2008.12.10 20:49
    • 4 COMMENTS
    • /
    • 0 LIKES
    • 최용일
      2008.12.10 21:02
      DB연결할 때 예외를 거세요. 처리해야 할 예외의 종류는 DB에 연결하는 컴포넌트에 따라서 달라질것입니...
    • 허수진
      2008.12.11 01:52
      감사합니다! ^^ 예외라고적혀있는곳엔..머라고 적어야 될지.. 컴포넌트는 ADO를 사용하고 있습니다~ ...
    • cell
      2008.12.11 03:18
      on E : EXCEPTION do begin ShowMessage(e.Message); end;
    • 허수진
      2008.12.11 18:03
      적어주신 코드로 했는데도 오류가 뜨네요 똑같이^^ 사용자가 로그인에 실패했다고.. 그뒤로 작동이 안되...
    • cell
    • 2008.12.10 18:54
    • 2 COMMENTS
    • /
    • 0 LIKES
    • 최용일
      2008.12.10 19:24
      aStream.writeBuffer(Buf, aStream.Size); ==> aStream.ReadBuffer(Buf[0], aStream.Size);
    • cell
      2008.12.10 22:31
      번번히... 감사합니다.
    • 이정욱
      2008.12.10 23:29
      네. 그럴경우가 있습니다. 컴파일러 지시자를 이용하여 컴파일 할 경우, 어떤 유닛은 과거에 다른 컴파일...
    • 이은주
      2008.12.11 07:34
      아 그렇군요... 답변 감사합니다. 그럼 결국 빌드가 해결 방법이라는 거군요. 그런대 빌드는 시간이...
    • 최용일
      2008.12.10 21:07
      undeclared identifier 말그대로 변수가 선언되지 않았다는 것입니다. 모든 변수/상수 등과 같은 identi...
    • 조일현
      2008.12.11 11:29
      아.. 선언을 할려고 했는데 어떤걸 선언할줄 몰라서요... 모르는 부분의 위쪽에 보면 ClearComboStri...
    • 이정욱
      2008.12.10 10:39
      Blob을 이용하시면 될듯...
    • 최진영
    • 2008.12.09 05:03
    • 2 COMMENTS
    • /
    • 0 LIKES
    • 최용일
      2008.12.09 07:02
      실수의 위치에 점을 찍을 수 없습니다. 원하는 좌표에 가장 가까운 정수로 변환해서 찍으세요... Trunc...
    • 최진영
      2008.12.09 18:47
      답변 감사합니다. 실수를 찍을 수는 없군요 +_+. 행복한 하루 보내세요. ^^
    • coderoad
      2008.12.31 00:34
      아직 안되었나봅니다. 조만간에 2009버전으로 올라올 거라 생각만 합니다.
    • 황진호
    • 2008.12.09 00:01
    • 5 COMMENTS
    • /
    • 0 LIKES
    • 이강석
      2008.12.09 01:33
      델파이 하고 바로 이런 에러가 뜬다면... Application 시작하는 처음 부분이나... 첫번째 폼에서 ...
    • 황진호
      2008.12.09 01:56
      저도 찾을수나 있었으면 좋겠네요.. 잘되던건데... 왜 그런지를 알수가~~ ㅠㅠ 그래서 답답하기만 하네...
    • 이강석
      2008.12.09 01:58
      그런데 컴파일하다가 에러가 나는건가요?? 아니면 빌드하다가 저런 메세지 나올리는 없고.. 런타임...
    • 황진호
      2008.12.09 18:46
      이강석님 관심 감사드립니다. 제가 실수로 breakpoint를 설정해놓았네요... 그부분이 계속 걸렸던...
    • 이강석
      2008.12.09 19:31
      해결됐으면 된거져...^^
    • 김재철
      2008.12.08 22:56
      // 폴더 전체 삭제(하위폴더 포함) procedure ClearFolder(sPath: String); var sr: TSearchRec; ...
    • cell
    • 2008.12.05 03:20
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 최용일
      2008.12.05 04:45
      PChar는 널종료 문자열입니다. 널문자(#0)를 문자열의 끝으로 인식합니다. 때문에 문자열의 맨 뒤에 널(#...