다음 테이블의 쿼리 조회는 조인 말고 방법이 없을까요? 0 4 1,284

by Gusto [SQLServer] [2015.10.07 11:41:58]


ID visit vars_1 vars_2 vars_3
TEST_1 D1 1 2 3
TEST_1 D2 1 2 3
TEST_1 D3 1 2 3
TEST_1 D8 1 2 3
TEST_2 D1 2 3 4
TEST_2 D2 2 3 4
TEST_2 D3 2 3 4
TEST_2 D8 2 3 4
TEST_3 D1 3 4 5
TEST_3 D2 3 4 5
TEST_3 D3 3 4 5
TEST_3 D8 3 4 5

 

위 데이터를 조회하고자 합니다. 현재는 LEFT OUTER JOIN 으로 사용하고 있는데, 다른 방법은 없을까 해서 질문 올리게 되었습니다.

현재 조건은 아이디별로 한 행에 변수값의 D1, D2가 나오도록 하는 코드입니다.

환경은 MS-SQL 2014입니다.

WITH TEST_TBL(id, visit, vars_1, vars_2, vars_3) as
(
 SELECT 'TEST_1', 'D1', '1', '2', '3' Union ALL
 SELECT 'TEST_1', 'D2', '1', '2', '3' Union ALL
 SELECT 'TEST_1', 'D3', '1', '2', '3' Union ALL
 SELECT 'TEST_1', 'D8', '1', '2', '3' Union ALL
 SELECT 'TEST_2', 'D1', '2', '3', '4' Union ALL
 SELECT 'TEST_2', 'D2', '2', '3', '4' Union ALL
 SELECT 'TEST_2', 'D3', '2', '3', '4' Union ALL
 SELECT 'TEST_2', 'D8', '2', '3', '4' Union ALL
 SELECT 'TEST_3', 'D1', '3', '4', '5' Union ALL
 SELECT 'TEST_3', 'D2', '3', '4', '5' Union ALL
 SELECT 'TEST_3', 'D3', '3', '4', '5' Union ALL
 SELECT 'TEST_3', 'D8', '3', '4', '5'
) SELECT 
 a.id as 'id_D1'
 , b.id as 'id_D2'
 , a.visit as 'visit_D1'
 , b.visit as 'visit_D2'
 , a.vars_1 as 'vars_1_D1'
 , b.vars_1 as 'vars_1_D2'
 , a.vars_2 as 'vars_2_D1'
 , b.vars_2 as 'vars_2_D2'
 FROM TEST_TBL as a
 LEFT OUTER JOIN TEST_TBL as b
 ON a.id = b.id and b.visit = 'D2'
 WHERE a.visit = 'D1'

 

위 코드 조회 결과는 다음과 같습니다.

id_D1 id_D2 visit_D1 visit_D2 vars_1_D1 vars_1_D2 vars_2_D1 vars_2_D2
TEST_1 TEST_1 D1 D2 1 1 2 2
TEST_2 TEST_2 D1 D2 2 2 3 3
TEST_3 TEST_3 D1 D2 3 3 4 4
by 아발란체 [2015.10.07 13:12:51]
SELECT
  id, visit, 'D2', vars_1, vars_1, vars_2, vars_2
FROM
  TEST_TBL a  
WHERE
  a.visit = 'D1'

--말씀 주신 OUTER 조인과  위 결과가 같습니다.

--즉 윈도우 함수를 쓰던 다른 방법을 강구하던, 2개 차이점을 나눌 수 있는 단서가 더 필요해 보입니다. 그냥 주어진 단서인 OUTER 조인 구문을 보면 왜 저렇게 꼬와서 결과를 출력하는지 전 감을 잡기가 어렵네용.. ㅋㅅㅋ)/


by Gusto [2015.10.07 13:31:02]

D1, D2 까지는 괜찮더라도 D3까지 출력하게 될 경우에는 OUTER JOIN이 걸려야하지 않나요?


by 마농 [2015.10.07 13:23:31]
SELECT id
     , MIN(CASE visit WHEN 'D1' THEN vars_1 END) vars_1_D1
     , MIN(CASE visit WHEN 'D2' THEN vars_1 END) vars_1_D2
     , MIN(CASE visit WHEN 'D1' THEN vars_2 END) vars_2_D1
     , MIN(CASE visit WHEN 'D2' THEN vars_2 END) vars_2_D2
     , MIN(CASE visit WHEN 'D1' THEN vars_3 END) vars_3_D1
     , MIN(CASE visit WHEN 'D2' THEN vars_3 END) vars_3_D2
  FROM test_tbl
 WHERE visit IN ('D1', 'D2')
 GROUP BY id
;

 


by Gusto [2015.10.07 13:31:35]

답변 고맙습니다. 이 코드로 다시 여러가지 조건을 걸어봐야겠네요!

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