Q&A

  • 이런 join 은 어떻게 하나요...
table  A
번호   중량
1       10
2       20
3       30

table  B
번호       일자           단가
  1     20100301     100
  1     20100302     150
  2     20100303     110

결과
번호     중량        일자           단가
  1        10     20100302     150
  2        20     20100303     110
  3        30

table A 와 B 를 JOIN 하여 위와같이 결과 가 나와야 하는데 잘 안되네요.
B table 에 같은 번호중에 제일 마지막 일자를 읽어와야 됩니다.
그리고 DB 는 파이어버드 2.0 입니다.
여러 고수님께 도움청합니다.
8  COMMENTS
  • Profile
    phono 2010.04.06 01:30
    DB 엔진을 무엇을 쓰느냐에 따라 틀려지지요..
  • Profile
    송동진 2010.04.06 01:52
    DB 는 파이어버드 2.0 입니다.
  • Profile
    땅콩맨 2010.04.06 02:56
    INNER JOIN 방법을 사용하시면 될 듯 싶습니다.

    INNER JOIN(내부조인)은 각 테이블에서 비교 연사자에 의해 조인 조건을 만족하는 행들만 조인 테이블에 포함시켜주는 조인입니다.
    SELECT tblA.번호, TblA.중량, tblB.일자, tblB.단가 FROM tblA AS o INNER JOIN tblB AS b ON o.번호 = b.번호
  • Profile
    phono 2010.04.06 08:56
    이너 조인이 아닌 아웃터 조인을 하세요..
    아웃터 조인은 두 테이블중 어느 한테이블에 자료가 존재하고 한 테이블엔 자료가 존재하지 않을시 사용하는 조인인데..,

    가급적 아웃터 조인은 권장하지 않지만 부득불 써야 할경우가 있습니다.

    바로 동진님과 같은 경우의 일이 발생했을때죠..

    MS-SQL 에서는 조건이 존재하지 않는쪽에 * 연산자를 붙혀서 표시 하고 오라클에서는 + 연산자를 붙혀 처리 합니다.

    그런데 지금의 구조에서는 테이블 A와 B가 1:N식이 되므로 B의 값을 번호별로 그룹핑하여 일자와 단가의 max값을 구하는 과정을 거쳐 중복되는 건을

    한건으로 만들어준후, 이를 테이블 A와 아웃터 조인을 해야 합니다.

    그런데 파이어버드 2.0이 이런 SQL을 지원해 줄지 모르겠네요.

  • Profile
    성더기 2010.04.07 02:45
    위의 경우라면 아우터 조인이 맞는거 같습니다.
    아우터 조인을 하는 문법은 위 phono님께서 설명하신 것 처럼 DBMS에 따라 여러가지가 있습니다
    DBMS에 관계없이 사용하고 싶으시다면 Ansi 문법을 사용하시면 됩니다. Ansi문법은 땅콩맨님께서 설명하신것 처럼 문법을 사용하구요
    LEFT OUTER JOIN
    RIGHT OUTER JOIN
    INNER JOIN 문법을 사용합니다. 다만 오라클의 경우 8.1.7 이후의 버전에서만 사용가능합니다
    위 결과를 얻기위해서는 땅콩맨님의 쿼리를 살짝 바꿔서
    SELECT o.번호, o.중량, b.일자, b.단가
    FROM tblA AS o
    LEFT OUTER JOIN tblB AS b ON o.번호 = b.번호
    로 하시면 됩니다
  • Profile
    송동진 2010.04.07 05:43
    답변 감사합니다.

    결과값 이
    1 10 20100301 100
    1 10 20100302 150
    2 20 20100301 110
    3 30 null null
    이런식으로 나오네요..

    원하는 결과는
    1 10 20100302 150
    2 20 20100301 110
    3 30 null null

    다시한번 도움 부탁합니다.
  • Profile
    땅콩맨 2010.04.07 07:59
    phono님이 위에 적으신대로 table B의 값을 번호별로 그룹핑하여 일자와 단가의 max값을 구하는 과정을 거쳐 중복되는 값을 한건으로 만들어주는
    과정이 필요할 듯 싶습니다. (phono님 내용 복사한 꼴이되었네요. ^^;;) - 중복값제거는 distinct를 사용하시면 됩니다.
  • Profile
    성더기 2010.04.12 19:18
    SELECT o.번호, o.중량, b.일자, b.단가
    FROM tblA AS o
    LEFT OUTER JOIN (SELECT *
    FROM tblB X
    INNER JOIN (SELECT 번호, MAX(일자) dt
    FROM tblB
    GROUP BY 번호) Y ON X.번호 = Y.번호 and x.일자 = y.dt
    ) AS b ON o.번호 = b.번호

    이렇게 처리하면 될거 같네요
    X, Y의 join 처리는 Where절의 sub query로 처리할 수 있으면 좋겠는데 기억이 안나네요..^^;
    • lee, js
    • 2010.04.08 02:30
    • 5 COMMENTS
    • /
    • 0 LIKES
    • phono
      2010.04.08 08:16
      WITH구분이 가상테이블을 만들어 다시 셀렉트 하거나, INSERT도 되는 기능을 구현 한것 같은데.. 제가 ...
    • lee, js
      2010.04.08 20:23
      제가 with문을 사용한 것은 phono 님 말대로 sql문의 간소화를 위해 가상의 외상테이블과 현잔액 테이블...
    • phono
      2010.04.09 07:59
      일단 뽑아 낼수 없느냐 있느냐를 떠나.. 일단 이러한 구조가 어떠한 업무를 처리하는데 왜 필요한...
    • 땅콩맨
      2010.04.12 04:52
      lee, js님의 업무에 대한 추가적인 부연설명도 뒷따라야 할것같습니다
    • 성더기
      2010.04.12 20:19
      SQL만 가지고는 해결이 불가능할거 같네요 DBMS가 MS-SQL 이라면 프로시저나 function으로 처리가 가능...
    • Atom
    • 2010.04.06 20:24
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 최용일
      2010.04.06 20:36
      array[0..9] of PChar 는 씨로 말하면 char *가 10개 있는 배열입니다. Info_partNum: array[0..9] of P...
    • 땅콩맨
    • 2010.04.07 08:08
    • 0 COMMENTS
    • /
    • 0 LIKES
    • 송동진
    • 2010.04.06 01:05
    • 8 COMMENTS
    • /
    • 0 LIKES
    • phono
      2010.04.06 01:30
      DB 엔진을 무엇을 쓰느냐에 따라 틀려지지요..
    • 송동진
      2010.04.06 01:52
      DB 는 파이어버드 2.0 입니다.
    • 땅콩맨
      2010.04.06 02:56
      INNER JOIN 방법을 사용하시면 될 듯 싶습니다. INNER JOIN(내부조인)은 각 테이블에서 비교 연사자에...
    • phono
      2010.04.06 08:56
      이너 조인이 아닌 아웃터 조인을 하세요.. 아웃터 조인은 두 테이블중 어느 한테이블에 자료가 존재하...
    • 성더기
      2010.04.07 02:45
      위의 경우라면 아우터 조인이 맞는거 같습니다. 아우터 조인을 하는 문법은 위 phono님께서 설명하신 것...
    • 송동진
      2010.04.07 05:43
      답변 감사합니다. 결과값 이 1 10 20100301 100 1 10 20100302 150 2 20 201...
    • 땅콩맨
      2010.04.07 07:59
      phono님이 위에 적으신대로 table B의 값을 번호별로 그룹핑하여 일자와 단가의 max값을 구하는 과정을 ...
    • • • •
    • 땅콩맨
      2010.04.04 21:07
      DB에서 값 Select하는 부분을 Loop로 돌려서 (이때 Richedit컨트롤을 메모리에 생성해서 Loop돌린갯수만...
    • 김영구
      2010.05.07 13:12
      시작부분이 ASCII 02번 () 이구요. 끝부분이 ASCII 03번 () 이네요. 시작과 끝 사이의 정보가 수신받...
    • 김정은
      2010.05.26 19:35
      (아스키2번 STX : 데이터 시작) ghgghg*^UU (아스키3번 ETX : 데이터 끝) *^UU -> 요 부분은 ...
    • 이용벽
    • 2010.04.03 10:22
    • 2 COMMENTS
    • /
    • 0 LIKES
    • phono
      2010.04.03 18:06
      서버측 프로그램이야 만들기 나름 아닐까요? 본래 서버라는 것은 "제공자"라는 의미로.. 클라이언트...
    • 땅콩맨
      2010.04.04 07:47
      P2P(Peer To Peer) 프로그램처럼 데이터를 받거나 보내는 기능 두가지를 원하시는건가요? 프루나같은 P2...
    • 강동엽
    • 2010.04.03 00:05
    • 2 COMMENTS
    • /
    • 0 LIKES
    • 땅콩맨
      2010.04.03 07:14
      indy 컴포넌트를 설치하면서 버전정보를 인식하는부분에서 조금 다르게 인식한것같습니다. 라이브러리패...
    • 지환부
      2010.04.16 05:44
      indy 컴퍼넌트가 버전별 속성문제 인듯합니다. 버전이 업그레이드 될경우 하위 버전에있던 속성들이 변...
    • 서선영
    • 2010.04.02 21:04
    • 2 COMMENTS
    • /
    • 0 LIKES
    • phono
      2010.04.02 23:55
      1: String 타입으로 하시면 됩니다. 2: 해당데이터셋의 필드 에디터를 이용하셔서 데이터셋에 각각...
    • 땅콩맨
      2010.04.03 05:32
      phono님의 답변에 조금더 몇마디 덧붙이자면 (Dataset.FieldByName('yourDateFieldName) as TDateTimeFi...
    • lee, js
    • 2010.04.02 02:15
    • 4 COMMENTS
    • /
    • 0 LIKES
    • 땅콩맨
      2010.04.02 03:15
      날짜와 날짜간에 금액계산이 연관되어서 계속 이루어져야하기 때문에 마지막 결제일이란 항목도 필요할 ...
    • phono
      2010.04.02 18:29
      많은 분들이 미수금(미지급금) 처리를 위해 입금, 매출(매입)을 분리 해서 처리 하는 경향이 있더군...
    • phono
      2010.04.02 18:40
      그리고 이러한 구조의 테이블 기준으로 해서 거래 이력을 생성해주면.. 사용자로 부터 입력받는 ...
    • 땅콩맨
      2010.04.03 04:12
      와 phono님 명쾌하게 답변을 해주셨네요. phono님 답변에 비추어보면 lee, js님이 설계하신 DB구조는 ...
    • lee, js
    • 2010.04.01 19:22
    • 4 COMMENTS
    • /
    • 0 LIKES
    • phono
      2010.04.01 19:52
      저는 ms-sql 7.0 이라.. 사이즈가 256이 한곈데, 요즘은 varchar가 4000 도 되는군요.. 일단 재고...
    • 땅콩맨
      2010.04.02 03:06
      그럼 phono님은 어떻게 처리하시는데요?
    • phono
      2010.04.02 18:07
      보통 저같은 경우는.. 품목별로 년 마감 테이블을 만들고.. 1년치 데이터는 전표에서 끌어오고 1년...
    • 땅콩맨
      2010.04.03 04:14
      아 테이블을 나눠서 처리가 되는거네요 그렇게되면 데이터관리하거나 처리할때 더 효과적이겠네요.
    • 배성철
    • 2010.04.01 13:54
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 땅콩맨
      2010.04.02 03:05
      예전에 영진출판사에서 발간된 Delphi Programming Bible이란 책이 있습니다. 이 책을 참고하시면 좀...
    • 한윤동
    • 2010.03.31 09:01
    • 6 COMMENTS
    • /
    • 0 LIKES
    • 땅콩맨
      2010.03.31 19:37
      Naver Window 7 카페에서 찾아보니 질문중 하나가 Program Files폴더가 2개가 존재하는데 무슨 문제가 ...
    • 한윤동
      2010.03.31 21:38
      네 그것을 저도 발견했는데요. program files(x86)이 32bit여서 그런 것 같습니다, 문제는 시스템이 받...
    • 박정순
      2010.03.31 22:30
      CDS.lpData 가 문자열 포인터를 가리키는 것 같은데...정적 배열로 사용하여 문자열을 배열에 복사하는 ...
    • 땅콩맨
      2010.04.01 05:14
      COPYDATASTRUCT cds; cds.dwData // 사용목적에 따른 식별값 cds.cbData; // 전달될 정...
    • 한윤동
      2010.04.02 07:50
      문제 찾았습니다..님들이 말씀해주신것을 참조해서 디버깅하다보니 문제가 GETOS 함수에 있네요 이 함...
    • 땅콩맨
      2010.04.03 04:07
      윤동님 올려주신 리플에 달린 소스를 살펴보니 lpData와 cbData순서가 바뀌었느데 이것도 문제가 되었...
    • lee, js
    • 2010.03.30 04:20
    • 4 COMMENTS
    • /
    • 0 LIKES
    • 땅콩맨
      2010.03.30 06:26
      select 일자, 외상금액-입금 as Field2 from tbl order by 일자 desc 로 돌려서 찍어주면 되지 않을까요?
    • phono
      2010.03.30 19:18
      오라클과 MS-SQL을 쓰신다면 row-num과, decode(오라클사용시), case문(ms-sql 사용시) 을 이용하세...
    • shininggem
      2010.03.30 19:18
      설명만으론 쿼리를 구하기가 난해하네요. 테이블 구조를 알아야.... 일단 생각나는 방식은, 현재 잔...
    • phono
      2010.03.30 19:28
      외상금액 누적 처리는 날짜값을 기준으로 서브쿼리와 상관 서브쿼리를 이용하시고.. 이렇게 해서 ...
    • phono
      2010.03.28 21:54
      Screen.Cursor := crSQLWait; ... 쿼리 처리... Screen.Cursor := crDefault;
    • 박성훈
      2010.03.28 23:36
      try Screen.Cursor := crSQLWait; {Code for handling database here...} finally Sc...
    • 땅콩맨
      2010.03.29 02:55
      아, 지나가다 한수배우고 갑니다.
    • 조약돌
      2010.03.29 03:07
      답변 감사합니다. sql모래시계 커서 모양이 마음에 안들어서 윈도우에서 사용하는 모래시계 ...
    • 한윤동
    • 2010.03.28 08:01
    • 9 COMMENTS
    • /
    • 0 LIKES
    • 땅콩맨
      2010.03.28 09:03
      액세스가 거부되었다면 Registry경로가 잘못되었다는 이야기일텐데요? 소스상에 명시된 레지스트리 경로...
    • 한윤동
      2010.03.28 09:12
      경로는 이상이 없거든요.. 이게 XP에서는 전혀 이상이 없어여... Window7에서만 엑서스가 거부되는데요...
    • 땅콩맨
      2010.03.28 09:50
      보통 관리자 권한이 아닐때 발생되긴 하는데... 관리자 권한이 아닐리도 없을테구요 음. Windows7에 파...
    • 한윤동
      2010.03.28 10:24
      답변주셔서 감사합니다. 일단 Activex파일을 잘 열립니다,. openkkey()에서 오류가 나는 건데요... 다...
    • 땅콩맨
      2010.03.29 02:53
      Windows7하고 XP와는 많이 다를것입니다. API함수도 지원하는것도 있고, 다른 이름으로 변경된것도 있을...
    • 한윤동
      2010.03.29 21:17
      procedure TForm1.Button2Click(Sender: TObject); var LocalReg : TRegistry; AppRegPath : stri...
    • 한윤동
      2010.03.29 21:39
      //RootKey := HKEY_LOCAL_MACHINE; 를 풀어 RootKey := HKEY_LOCAL_MACHINE; 로 하면 하나도 안 읽혀여
    • • • •
    • 김선웅
    • 2010.03.27 08:10
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 땅콩맨
      2010.03.28 09:04
      uses 절에 SysConst를 선언해 주심됩니다.
    • 김정국
    • 2010.03.27 01:55
    • 8 COMMENTS
    • /
    • 0 LIKES
    • 김정국
      2010.03.27 02:04
      추가... 어찌어찌 하다가.. Conn.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data...
    • 땅콩맨
      2010.03.27 06:42
      파라독스 DB를 MSSQL등의 다른 DB형태로 포팅을 해보시는 방법도 고려해 볼 수 있지 않을까요?
    • phono
      2010.03.27 08:19
      ado를 사용해서 파라독스 db에 접근해야 할텐데요.. 아마 윈도우에서 기본적으로 제공되는 파라독스 db...
    • 김정국
      2010.03.27 17:45
      아...결국 안되는거군요...ㅠㅠ 한번만 열어 보려는건 아니구여...ㅠㅠ view.db에는 계속 적으로 ...
    • phono
      2010.03.27 21:28
      델파이툴에 보믄 데이터 펌프라는게 있습니다. 이걸 어디서 구할수 있다면.., 이걸로 일단 파라독스 ...
    • 땅콩맨
      2010.03.28 08:49
      ado로 해서.. 그 다음은 뭐죠? ㅋㅋ ^^ 정국님, phono님 말씀대로 포팅하는것도 한가지 방법입니다. ...
    • phono
      2010.03.28 10:21
      재개발 한다면 아마 정국님이 vb쪽이나 ms 쪽을 쓰고 있는 것 같으므로 델파이쪽도 ado를 이용해서 개...
    • • • •