반응형

비슷한 구조를 가진 Table이 이름만 다른채로 여러개로 퍼져서 운영되는 경우,

join, union을 사용해서 데이터를 추출하려고 해도, Table이 많아지면 결국 노가다가 된다.


이런 경우 GROUP_CONCAT을 이용하면 유용하다.


# 결과 쿼리가 들어갈 변수 선언
SET @resultQuery = NULL;

# GROUP_CONCAT으로 쿼리 문자열에 쿼리문을 생성하여 등록
SELECT 
    GROUP_CONCAT(
    DISTINCT      // 문자열이 중복된 경우 제거해주는 옵션인 듯)
    CONCAT('(select 컬렴명1, 컬럼명2 from ', table_name, ' limit 1)') 
    SEPARATOR '\r\nUNION\r\n' // 각 쿼리를 뭘로 연결할 것인지 (센스있게 마지막쿼리엔 붙지 않음)
    )
INTO @resultQuery
FROM information_schema.TABLES
WHERE table_name LIKE '테이블명%';      // 본인의 경우 prefix가 같아서 이렇게 사용

# 문자열로 쿼리가 등록된 상황이므로, prepare statement를 이용하여 실행해준다. (select로 하게되면, 문자열 자체가 결과로 나오게됨)
PREPARE stmt FROM @resultQuery;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;



이슈1) UNION 문과 limit문을 같이 사용하는 경우, 쿼리에 괄호가 누락되면 제대로 동작을 하지 않는다. 각 쿼리에 limit문이 들어간다면, 괄호문을 꼭 넣어주도록 하자.


이슈2) 아마 쿼리문이 1024 byte를 넘어가면, 짤리는 현상이 생겨서 실행이 제대로 되지 않을 것이다.


이런 경우 아래 명령어로 group_concat의 최대 사이즈를 늘려주자. (varchar니깐 65535까지 되는 것 같음)


SET SESSION group_concat_max_len = 65535;


DBA에게 위에 요구사항을 만족하는 쿼리 요구를 했더니, 엑셀을 열더니 노가다 방법을 알려주시더군.. 뭐 그럴수있지;

반응형
,