안녕들하세요~ SELECT 쿼리 중에 궁금한게 있어서 글올립니다..
우선 아래와 같이 데이터가 있습니다.
테이블 [user]
userId | userName | userType |
100 | john | 1 |
101 | doe | 2 |
102 | jack | 2 |
103 | smith | 1 |
테이블 [user_info_1]
userId | countDay | countWeek |
100 | 1 | 2 |
103 | 3 | 5 |
테이블 [user_info_2]
userId | countMin | countHour |
101 | 5 | 12 |
102 | 10 | 7 |
user 테이블의 사용자는 userType 에 따라 사용자 정보가 각각 다른 테이블에 저장되어 있는 구조입니다.
즉, userType=1 인 사용자는 user_info_1 테이블에 사용자 정보가 있고, userType=2 인 사용자는 user_info_2 테이블에 사용자 정보가 있습니다.
여기서 제가 하고 싶은 건, 어떤 사용자의 사용자 정보를 조회하는 것입니다.
제일 단순무식한 방법은.. user 테이블을 SELECT 후, userType 값에 따라 각각 다른 테이블을 SELECT 하는 것이겠지요..
그런데 JOIN을 이용하여 하나의 쿼리로 user_info 테이블까지 조회할 수가 있을까요??
SELECT ... FROM user u, user_info_1 i1, user_info_2 i2 WHERE u.userId = 100;
무식하게도.. 이런 식으로 하니.. 다수의 row가 조회되네요..
틈틈히 JOIN 공부를 해뒀어야하는데.. 조언이라도 좀 부탁드립니다.. ^^;
WITH USR AS ( SELECT '100' USERID, 'JOHN' USERNAME, '1' USERTYP FROM DUAL UNION ALL SELECT '101' USERID, 'DOE' USERNAME, '2' USERTYP FROM DUAL UNION ALL SELECT '102' USERID, 'JACK' USERNAME, '2' USERTYP FROM DUAL UNION ALL SELECT '103' USERID, 'SMITH' USERNAME, '1' USERTYP FROM DUAL ) , USER_INFO_1 AS ( SELECT '100' USERID, '1' COUNTDAY, '2' COUNTWEEK FROM DUAL UNION ALL SELECT '103' USERID, '3' COUNTDAY, '5' COUNTWEEK FROM DUAL ) , USER_INFO_2 AS ( SELECT '101' USERID, '5' COUNTDAY, '12' COUNTWEEK FROM DUAL UNION ALL SELECT '102' USERID, '10' COUNTDAY, '7' COUNTWEEK FROM DUAL ) SELECT * FROM usr u, user_info_1 i1 WHERE u.userid = :in_userid AND u.usertyp = '1' AND u.userid = i1.userid UNION ALL SELECT * FROM usr u, user_info_2 i2 WHERE u.userid = :in_userid AND u.usertyp = '2' AND u.userid = i2.userid
이러면 되지 않을까요?
그건 오라클도 마찬가지예요. 컬럼명은 위에 컬럼 alias 기준으로 출력됩니다.
다르게 하시려면
SELECT
col1, null col2
FROM
usr u, user_info_1 i1
WHERE
u.userid = :in_userid
AND
u.usertyp =
'1'
AND
u.userid = i1.userid
UNION
ALL
SELECT
null col1, col2
FROM
usr u, user_info_2 i2
WHERE
u.userid = :in_userid
AND
u.usertyp =
'2'
AND
u.userid = i2.userid