2018년 4월 3일 화요일

[postgresql]Union을 이용하여 하나 이상의 rows의 비 중복 values를 가져오기

보드 게시판에서 카테고리가 두개로 나뉘어져 있습니다.

select Category1 as cat1, Category2 as cat2 from board;
---------------
cat11   |  cat2
---------------
Blog    |   note
Blog    |   diary
Code   |   tutorial
Code   |   tutorial
Code   |   note
---------------

목적은, 각 카테고리의 값들을 가져오는데, 중복은 재외하는것 입니다.

select district Category1 as cat1 from board;
select district Category2 as cat2 from board;
-------
cat1
-------
Blog
Code
-------


-------
cat2
-------
note
diary
tutorial
note
-------


하지만 굳이 query문을 두번이나 쓸 필요가 있을까 싶었기 때문에, 삽질과 질문을 한 끝에
UNION 을 사용하면 된다는것을 알았습니다.

UNION은 두 select문의 출력할 rows가 동일할때, 두 출력문을 하나로 합치는 기능인데요,
이때 중복 또한 예외처리가 되었습니다.

위의 코드에서 사용하기위해, 각 각의 select문을 동일한 출력으로 만들면 되는데요,
select Category1 as cat1, NULL as cat2 from board
를 치게 되면
----------
cat1  | cat2
----------
Blog   | NULL
Blog   | NULL
Code  | NULL
Code  | NULL
Code  | NULL
-----------

으로 나오게 됩니다.

동일하게 cat2 에도 같은 select문을 사용하여

select NULL as cat1, Category2 as cat2 from board
---------------
cat1   | cat2
---------------
NULL  |   note
NULL  |   diary
NULL  |   tutorial
NULL  |   tutorial
NULL  |   note
---------------

그럼 이제 두 select문을 합치게되면,

SELECT Category1 AS cat1, NULL AS cat2
FROM board
UNION
SELECT NULL AS cat1, Category2 AS cat2
FROM board;

그리고 출력물은
---------------
cat1   | cat2
---------------
NULL  |   note
NULL  |   diary
NULL  |   tutorial
Blog   |   NULL
Code  |   NULL
---------------

요로코롬 나오게 됩니다!

이게 쿼리 두번 날리는것보다 빠른건지 데이터가 많이 없어서 증명은 못하겠지만..
더 효율적이라고 판단하고 자위하는중..

제 케이스에서는
각 각 select문은 230ms 가 걸렸으나,
union을 통한 한번의 query문은 280ms가 갈렸습니다

 

댓글 없음:

댓글 쓰기