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문을 재작성하시기 바랍니다.