3개의 테이블 SELECT 쿼리 0 4 2,350

by 박건우 [SQL Query] SELECT JOIN [2015.03.14 17:18:00]


안녕들하세요~ 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 공부를 해뒀어야하는데.. 조언이라도 좀 부탁드립니다.. ^^;

by jkson [2015.03.14 17:51:20]
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

이러면 되지 않을까요?


by 박건우 [2015.03.14 18:14:27]

답변 감사드립니다..^^

user_info_1/2 테이블에 중복으로 들어가는 경우가 없어서 'UNION'으로 위,아래의 쿼리 값을 합치면 되겠네요.

그런데 제가 사실 오라클이 아니라 알티베이스를 사용 중인데요,

UNION 위, 아래의 쿼리에서 가져오려는 컬럼 이름이 다른 경우, 제대로 표시되지 않는 문제가 있어 보이네요.. (UNION 위 쿼리결과는 없고, 아래의 쿼리 결과만 출력되었는데.. 출력된 컬럼이름은 위의 것이네요)

오라클에서는 컬럼 이름이 표시가 잘 되겠죠? ^^;

 


by jkson [2015.03.14 18:30:58]
그건 오라클도 마찬가지예요. 컬럼명은 위에 컬럼 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
 
이런 식으로 따로 컬럼 분리해서 뒷단에서 따로 사용하시는 수밖에요.

by 박건우 [2015.03.14 19:16:02]

아아.. NULL 을 써서 하는 수가 있네요..!!

조언 감사합니다 ^^

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