Q&A

  • A,B 테이블 조인시 B 테이블의 값을 선택적으로 가져오는 쿼리좀 알려주세요.
A 테이블
   번호 성명
     1   김말자
     2   홍길동
     3   전두한
     4   노총각

B 테이블
    번호  관계  이름
      1     부    김두한
      1     모    김을동
      2     부    홍영길
      2     처    김희선
      3     처    이슨자

이런 테이블 2개 가 있는데 결과는

A1, A김말자, B.부, B.김두한
A2, A홍길동, B.처, B.김희선
A3, A전두한, B.처, B.이슨자
A4, A노총각

이렇게 A 테이블을 기준으로 B 테이블을 조인시키고 싶은데 B 테이블의 우선순위가  '처>부>모'로 해서 처가 있다면 처를 없다면 부를 부가 없다면 모를 같이 보여주고 싶은데 조건을 어떻게 줘야 할지 모르겟네요.

left 조인시키니..
A1, A김말자, B.부, B.김두한
A1, A김말자, B.모, B.김을동
.
.

이렇게 여러가 다 나오네요... 여러개 값중 특정한 값을 어떻게 끌고 와야 하는지 좀 알려주세요.
1  COMMENTS
  • Profile
    착한천사 2005.04.01 19:14
    SQL질문을 주실때에는 반드시,
    사용하시는 DATABASE 종류(예, 오라클, MS-SQL, 파라독스, MDB, MySQL, firebird,인터베이스등등)
    를 먼저 알려 주시는게 SQL문 작성에 도움이 될꺼라 생각됩니다..

    일단, Single Database중 파라독스에서는 SQL문장만으로는 불가능하구요..
    임시테이블을 만들어서.. filtering 한 후 join을 해야하는 번거로움이 있습니다..
    굳이, 임시테이블을 만들지 않는다면, third-party tools(예, 델파이,VB,PB등등)에서
    처리를 하시면 되겠구요..

    그외.. 데이타베이스에서는 아래와 같이 하면 되겠습니다..

    [ ORACLE 8I 이상 ]
    <!--CodeS-->
    SELECT A.SEQNO, A.NAME, B.RELATION, B.NAME
      FROM TA A,
           ( SELECT SEQNO, RELATION, NAME
               FROM (SELECT SEQNO, RELATION, NAME,
                            RANK() OVER (PARTITION BY SEQNO ORDER BY DECODE(RELATION,'처',1,'부',2,3)) RN
                       FROM TB
                     )
              WHERE RN = 1
           ) B
    WHERE A.SEQNO = B.SEQNO (+)
    <!--CodeE-->

    [ Single DB를 제외한 DATABASE에서 사용가능한 SQL문 ]

    Decode 함수는 Database에 따라서, Case 문장으로 교체를 하셔야 할 겁니다..
    또한, Outer Join에 해당되는 것 또한,
    Database에 따라서 틀리게 될겁니다.. 왜냐하면, Database에 따른
    Syntax 문제이기 때문이죠..

    (현재는 Oracle 기준으로 설명을 했음..)
    <!--CodeS-->
    SELECT T1.SEQNO, T1.NAME, T2.RELATION, T2.NAME
      FROM TA  T1,
           (SELECT A.SEQNO, A.NAME, A.RELATION
              FROM TB A,
                   (SELECT SEQNO, MIN(DECODE(RELATION,'처',1,'부',2,3)) RN
                      FROM TB
                     GROUP BY SEQNO
                    ) B
             WHERE A.SEQNO = B.SEQNO
               AND A.RELATION = DECODE(B.RN, 1, '처',2,'부','모')
            ) T2
    WHERE T1.SEQNO = T2.SEQNO (+)
    <!--CodeE-->

    T2에 outer join을 한 상태는 질문하신분께서
    아실꺼라 생각됩니다..

    ps.
    현재 SQL이 정확한 결과값을 추출하겠지만,
    Execute Plan상으로 좋다고는 말할 수 없습니다..
    왜냐하면, TB의 Data건수에 따라서 틀릴테니까 말입니다..
    위 SQL에서 보시면,
    <!--CodeS-->
    SELECT A.SEQNO, A.NAME, A.RELATION
              FROM TB A,
                   (SELECT SEQNO, MIN(DECODE(RELATION,'처',1,'부',2,3)) RN
                      FROM TB
                     GROUP BY SEQNO
                    ) B
             WHERE A.SEQNO = B.SEQNO
               AND A.RELATION = DECODE(B.RN, 1, '처',2,'부','모')
    <!--CodeE-->
    부분에서 TB를 2번 Table에서 Access했지만,
    실제로는 1번만 Access해도 되겠죠..
    예를 들면, Data복제법을 이용하면, 될테니까 말입니다..
    만약, Data건수로 인해서 Select 속도가 늦게 나온다면,
    Data복제법을 이용하여 SQL문을 재작성하시기 바랍니다.
서버에 요청 중입니다. 잠시만 기다려 주십시오...