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.김을동
.
.
이렇게 여러가 다 나오네요... 여러개 값중 특정한 값을 어떻게 끌고 와야 하는지 좀 알려주세요.
사용하시는 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문을 재작성하시기 바랍니다.