mysql outerjoin 문의 0 1 1,876

by captain [MySQL] [2015.11.23 12:08:24]


안녕하세요.

 

1:N 으로 연결된 4개의 테이블이 있습니다.

 

TABLE A

ID

----

A

B

C

 

TABLE B

ID PW
------
A  AAA
B  BBB
C  CCC

TABLE C

ID FAMILY
---------
A  홍길동
A  임꺽정
A  성춘향
B  네이버
B  다음


TABLE D

ID FRIEND
---------
A  가나다
B  라마바
B  자차카
C  타파하

------------------------------------------------------

보여주고자하는 데이타
-------------------------------------------------------

ID PW   FAMILY FRIEND
A  AAA  홍길동 가나다
A         임꺽정
A         성춘향
B  BBB   네이버 라마바
B         다음   자차카
C  CCC         타파하

B/C/D 테이블간에는 연관관계가 없습니다. (오직 A로만 연관)

그냥 outer로 하면 b c d 까지 outer가 되어 너무 많은 row가 나옵니다.

쿼리로 가능할까요?... (MySQL)

감사합니다.

by 마농 [2015.11.23 13:50:36]

조인키가 없으므로 인조 조인키를 만들어 줘야 합니다.
ROW_NUMBER() OVER(PARTITION BY id ORDER BY 1) 이런 식입니다.
각 테이블마다 ID 별 순번을 부여하여 이 순번으로 조인하면 되는데...
MySQL 에서는 ROW_NUMBER 기능이 없죠.
 

SELECT a.id
     , b.pw
     , f.family
     , f.friend
  FROM tab_a a
 INNER JOIN tab_b b
    ON a.id = b.id
  LEFT OUTER JOIN
       (SELECT id
             , rn
             , MIN(family) family
             , MIN(friend) friend
          FROM (SELECT c.id
                     , COUNT(c1.id) rn
                     , c.family
                     , null friend
                  FROM tab_c c
                  LEFT OUTER JOIN tab_c c1
                    ON c.id = c1.id
                   AND c.family > c1.family
                 GROUP BY c.id, c.family
                 UNION ALL
                SELECT d.id
                     , COUNT(d1.id) rn
                     , null family
                     , d.friend
                  FROM tab_d d
                  LEFT OUTER JOIN tab_d d1
                    ON d.id = d1.id
                   AND d.friend > d1.friend
                 GROUP BY d.id, d.friend
                ) e
         GROUP BY id, rn
        ) f
    ON a.id = f.id
 ORDER BY id, rn
;

 

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입