테이블 조인? 질문드립니다. 0 13 2,220

by 곰돌이 [MySQL] [2013.05.27 16:49:57]


1번째결과.JPG (35,238Bytes)
2번째결과.JPG (15,096Bytes)
결과.jpg (50,037Bytes)

두 테이블의 키는 id이구요 마지막 3번째 결과와 같이 나타내고싶은데요..

어떻게해결해야할까요.. 주륵..ㅠ

MYSQL입니다. ㅜㅜ
by 채용근 [2013.05.27 17:08:45]

WITH T_1 AS
(
    SELECT 'A' FROM DUAL
)
, T_2 AS
(
    SELECT 'B' FROM DUAL
)
SELECT *
  FROM
(
  SELECT ROWNUM rn
    FROM T_1
   , COL
) a
,
(
  SELECT ROWNUM rn
   , COL
    FROM T_2
) b
WHERE a.rn = b.rn(+)

Full outer 응용

by 채용근 [2013.05.27 17:12:04]

partition outer join으로도 검색해보세요

by 우리집아찌 [2013.05.27 17:23:29]
partition outer join 이란게 있었군요.. 리포트 할때 좋겠어요..

by 우리집아찌 [2013.05.27 17:20:49]
-- 그냥 FULL OUTER JOIN
WITH T1 (ID , USER_NO , DT , BEGIN , END , TYPE , DETAIL , ISUUE ) AS (
SELECT '6' , '3' , '2013-05-21' , '09:00:00' , '16:00:00' ,'1','trac 설정 및 소스 바인딩' ,'' FROM DUAL UNION ALL
SELECT '8' , '3' , '2013-05-21' , '16:00:00' , '17:00:00' ,'4','개발장비 이동 및 네트워크 구성' ,'' FROM DUAL UNION ALL
SELECT '10', '3' , '2013-05-21' , '17:00:00' , '22:00:00' ,'5','샘플 프로젝트 개선 (미완료)' , null FROM DUAL 
),T2 (ID , USER_NO , DT , DETAIL ) AS(
SELECT '4' , '3' , '2013-05-21' , '샘플 프로젝트 개선' FROM DUAL UNION ALL
SELECT '6' , '3' , '2013-05-21' , '교육자료 제작' FROM DUAL 
)
SELECT * FROM 
    (SELECT rownum num , T1.* FROM T1 ) T1
    FULL OUTER JOIN 
    (SELECT rownum num , T2.* FROM T2 ) T2
    ON T1.num = T2.num

by 곰돌이 [2013.05.27 17:29:07]
답변 감사합니다. 그런데 MYSQL이라.. 파티션이라던가 ROWNUM기능을.. 못찾겟어요

by 채용근 [2013.05.27 17:35:43]

SELECT * FROM
(SELECT @ROWNUM := @ROWNUM + 1 AS rownum, T1.* FROM T1, ( SELECT @ROWNUM = 0 ) ) T1
FULL OUTER JOIN
(SELECT @ROWNUM := @ROWNUM + 1 AS rownum , T2.* FROM T2, ( SELECT @ROWNUM = 0 ) ) T2
ON T1.rownum = T2.rownum

by 마농 [2013.05.27 17:45:54]
예제엔 하나의 user_no 뿐이네요?
user_no 가 여러게 조회될 경우 어떤식으로 나와야 할까요?
user_no 별로 따로 합치는 건가요? 아니면 user_no 는 상관 없이 id 순서대로만 나오면 되는 건가요?

예제엔 1번 테이블의 결과가 더 많은데요? 반대로 2번 테이블이 더 많을 수도 있나요?

by 곰돌이 [2013.05.27 17:54:26]
user_no와 날짜별로 묶고 싶고요,
2번 테이블이 결과가 더 많을수도 있습니다.
1) T1, T2
   null, T2
 
2) T1, T2
    T1, null

user_no와 date를 일주일치를 검색해서 날짜별로 묶고 싶은데,
너무 어렵네요



by 마농 [2013.05.27 18:01:11]
날짜는 일주일치고 user_no 는 조건이 어떻게 되나요?
하나의 user_no 만 이퀄조건으로 비교하나요? 아니면 여러개 올수도 있나요?

by 곰돌이 [2013.05.27 18:46:53]
user_no는 이퀄입니다..

by 야신 [2013.05.28 13:41:39]
오라클에서는 아래와 같이 하면 되는데....
mysql 에서는 row_number 와 같은 기능을 구현해야 합니다.( 일자별과 유저별로 순번을 채번하기 위해 )
해당 기능은 http://hanulnun.egloos.com/2284115 를 참조하세요.
full outer join 은 오라클이나 mysql 이나 동일합니다.
(※ 예제는 우리집아찌 님의 것을 이용하였습니다. )

WITH T1 (tID , USER_NO , DT , BEGIN , END , TYPE , DETAIL , ISUUE ) AS (
SELECT '6' , '3' , '2013-05-21' , '09:00:00' , '16:00:00' ,'1','trac 설정 및 소스 바인딩' ,'' FROM DUAL UNION ALL
SELECT '8' , '3' , '2013-05-21' , '16:00:00' , '17:00:00' ,'4','개발장비 이동 및 네트워크 구성' ,'' FROM DUAL UNION ALL
SELECT '10', '3' , '2013-05-21' , '17:00:00' , '22:00:00' ,'5','샘플 프로젝트 개선 (미완료)' , null FROM DUAL 
),T2 (tID , USER_NO , DT , DETAIL ) AS(
SELECT '4' , '3' , '2013-05-21' , '샘플 프로젝트 개선1' FROM DUAL UNION ALL
SELECT '5' , '3' , '2013-05-21' , '샘플 프로젝트 개선2' FROM DUAL UNION ALL
SELECT '7' , '3' , '2013-05-21' , '샘플 프로젝트 개선3' FROM DUAL UNION ALL
SELECT '6' , '3' , '2013-05-21' , '교육자료 제작' FROM DUAL 
)
SELECT * FROM
    (SELECT row_number() OVER( PARTITION BY dt, user_no  ORDER BY dt, user_no) AS x_NUM , T1.* FROM T1 ) TT1
    FULL OUTER JOIN
    (SELECT to_char(row_number() OVER( PARTITION BY dt, user_no  ORDER BY dt, user_no)) AS x_NUM,   T2.* FROM T2 ) TT2
    ON TT1.x_num||'_'||tt1.dt||'_'||tt1.user_no = TT2.x_num ||'_'||tt2.dt||'_'||tt2.user_no

by 마농 [2013.05.28 14:04:47]
SELECT user_no, date, rn
     , MIN(id1     ) id1
     , MIN(user_no1) user_no1
     , MIN(date1   ) date1
     , MIN(id2     ) id2
     , MIN(user_no2) user_no2
     , MIN(date2   ) date2
  FROM (
        SELECT @rn := CASE WHEN @dt = date THEN @rn + 1 ELSE 1 END rn
             , @dt := date
             , user_no
             , date
             , id      id1
             , user_no user_no1
             , date    date1
             , NULL    id2
             , NULL    user_no2
             , NULL    date2
          FROM (SELECT 6 id, 3 user_no, '2013.05.21' date
                UNION ALL SELECT  8, 3, '2013.05.21'
                UNION ALL SELECT 10, 3, '2013.05.21'
                UNION ALL SELECT 11, 3, '2013.05.22'
                UNION ALL SELECT 12, 3, '2013.05.22'
                ORDER BY user_no, date, id
                ) t1
             , (SELECT @rn := 0
                     , @dt := ''
                ) r
         UNION ALL
        SELECT @rn := CASE WHEN @dt = date THEN @rn + 1 ELSE 1 END rn
             , @dt := date
             , user_no
             , date
             , NULL    id1
             , NULL    user_no1
             , NULL    date1
             , id      id2
             , user_no user_no2
             , date    date2
          FROM (SELECT 4 id, 3 user_no, '2013.05.21' date
                UNION ALL SELECT 6, 3, '2013.05.21'
                UNION ALL SELECT 7, 3, '2013.05.22'
                UNION ALL SELECT 8, 3, '2013.05.22'
                UNION ALL SELECT 9, 3, '2013.05.22'
                ORDER BY user_no, date, id
                ) t2
             , (SELECT @rn := 0
                     , @dt := ''
                ) r
        ) x
 GROUP BY user_no, date, rn
 ORDER BY user_no, date, rn
;

by 곰돌이 [2013.05.28 14:57:26]
답변정말로 감사드립니다 더 공부해보겟습니다
댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입