테이블 결합을 하려고 하는데 어떤 방식으로 접근해야 될지 잘 모르겠습니다.
자료는 다음과 같은 형태로 들어가있습니다.
1. 각 테이블의 ID, VISIT 값은 같거나 다를 수 있다.
2. 테이블에서 동일한 컬럼명을 가진 변수는 ID와 VISIT이다. 그 외 컬럼명은 자료의 특성에 따라 다르다.
위 예제 테이블을 하나의 테이블로 합치려고 합니다. JOIN 으로도 해보고 했는데 조건절이 잘못되었는지 ID가 누락되거나 VISIT이 누락되는 문제가 발생하네요.
WITH tbl1(id, visit, vars_1, vars_2) as ( SELECT 'test_1', 'D1', '1_vars_1_1', '1_vars_2_1' UNION ALL SELECT 'test_1', 'D2-1', '1_vars_1_2_1', '1_vars_2_2_1' UNION ALL SELECT 'test_1', 'D8', '1_vars_1_8', '1_vars_2_8' UNION ALL SELECT 'test_2', 'D1', '2_vars_1_1', '2_vars_2_1' UNION ALL SELECT 'test_2', 'D2-1', '2_vars_1_2_1', '2_vars_2_2_1' UNION ALL SELECT 'test_2', 'D8', '2_vars_1_8', '2_vars_2_8' UNION ALL SELECT 'test_4', 'D1', '4_vars_1_1', '4_vars_2_1' UNION ALL SELECT 'test_4', 'D2-1', '4_vars_1_2_1', '4_vars_2_2_1' UNION ALL SELECT 'test_4', 'D8', '4_vars_1_8', '4_vars_2_8' ), tbl2(id, visit, vars_3, vars_4) as ( SELECT 'test_1', 'D1', '1_vars_3_1', '1_vars_4_1' UNION ALL SELECT 'test_1', 'D2-1', '1_vars_3_2_1', '1_vars_4_2_1' UNION ALL SELECT 'test_1', 'D3', '1_vars_3_3', '1_vars_4_3' UNION ALL SELECT 'test_3', 'D1', '3_vars_3_1', '3_vars_4_1' UNION ALL SELECT 'test_3', 'D2-1', '3_vars_3_2_1', '3_vars_4_2_1' UNION ALL SELECT 'test_3', 'D8', '3_vars_3_8', '3_vars_4_8' )
Comment 4
-
Terry
2015.10.19 12:41
-
Gusto
2015.10.19 13:27
UNION ALL로 묶으면 컬럼값이 임의로 합쳐지는 경우가 발생하지 않나요? 음...
-
Gusto
2015.10.19 13:24
만약 FULL OUTER JOIN 으로 접근할 경우 그룹으로 묶을 ID와 VISIT 컬럼이 두 번씩 출력됩니다.
SELECT * FROM tbl1 FULL OUTER JOIN tbl2 ON tbl1.id = tbl2.id
ID, VISIT, vars_1, vars_2, ID, VISIT, vars_3, vars_4
이걸 ID, VISIT, vars_1, vars_2, vars_3, vars_4로 출력되게 하기 위해서 아래와 쿼리를 짜고 있습니다.
SELECT * FROM ( SELECT id FROM tbl1 WHERE id is not null UNION SELECT id FROM tbl2 WHERE id is not null ) as main , ( SELECT visit FROM tbl1 WHERE visit is not null UNION SELECT visit FROM tbl2 WHERE visit is not null ) as sub ORDER BY main.id, sub.visit
-
Terry
2015.10.19 13:46
이런..visit 도 그룹으로 묶어야 했군요..
이놈의 난독증 ㅡ,.ㅜ
하기 쿼리는 동일 id,visit 인 경우에
각각의 컬럼 ( vars_1,vars_2,vars_3,vars_4 ) 가
전부 1:1 로 매칭이 된다는 가정하에서 기술된 쿼리입니다..
참고만 하세요..
---쿼리시작---
WITH tbl1(id, visit, vars_1, vars_2) as
(
SELECT 'test_1', 'D1', '1_vars_1_1', '1_vars_2_1' UNION ALL
SELECT 'test_1', 'D2-1', '1_vars_1_2_1', '1_vars_2_2_1' UNION ALL
SELECT 'test_1', 'D8', '1_vars_1_8', '1_vars_2_8' UNION ALL
SELECT 'test_2', 'D1', '2_vars_1_1', '2_vars_2_1' UNION ALL
SELECT 'test_2', 'D2-1', '2_vars_1_2_1', '2_vars_2_2_1' UNION ALL
SELECT 'test_2', 'D8', '2_vars_1_8', '2_vars_2_8' UNION ALL
SELECT 'test_4', 'D1', '4_vars_1_1', '4_vars_2_1' UNION ALL
SELECT 'test_4', 'D2-1', '4_vars_1_2_1', '4_vars_2_2_1' UNION ALL
SELECT 'test_4', 'D8', '4_vars_1_8', '4_vars_2_8'
), tbl2(id, visit, vars_3, vars_4) as
(
SELECT 'test_1', 'D1', '1_vars_3_1', '1_vars_4_1' UNION ALL
SELECT 'test_1', 'D2-1', '1_vars_3_2_1', '1_vars_4_2_1' UNION ALL
SELECT 'test_1', 'D3', '1_vars_3_3', '1_vars_4_3' UNION ALL
SELECT 'test_3', 'D1', '3_vars_3_1', '3_vars_4_1' UNION ALL
SELECT 'test_3', 'D2-1', '3_vars_3_2_1', '3_vars_4_2_1' UNION ALL
SELECT 'test_3', 'D8', '3_vars_3_8', '3_vars_4_8'
)
,tbl3(id,visit,vars_1,vars_2,vars_3,vars_4) as
(
Select a.id As id
,a.visit As visit
,a.vars_1 As vars_1
,a.vars_2 As vars_2
,'' As vars_3
,'' As vars_4
From tbl1 aUnion All
Select a.id As id
,a.visit As visit
,'' As vars_1
,'' As vars_2
,a.vars_3 As vars_3
,a.vars_4 As vars_4
From tbl2 a
)
Select a.id As id
,a.visit As visit
,Max(a.vars_1) As vars_1
,Max(a.vars_2) As vars_2
,Max(a.vars_3) As vars_3
,Max(a.vars_4) As vars_4
From tbl3 a
Where IsNull(a.visit,'') <> ''
Group By a.id
,a.visit
Order By a.id Asc
,a.visit Asc
과제인듯한 느낌이네요~~
힌트를 드리자면..
1) tbl1과 tbl2 를 union all 로 묶고
2) id 값을 토대로 group by 처리
3) id 외의 값 ( vars_1,vars_2,vars_3,vars_4) 은 max 로 빼준다.
참고만 하세요~~