2014-01-17 2 views
0

나는 테이블이 있습니다변환 열

+--------------+-------+--------+----------+ 
| attribute_id | color | brand | category | 
+--------------+-------+--------+----------+ 
|   1 | red | honda | cars  | 
|   2 | blue | bmw | cars  | 
|   3 | pink | skonda | vans  | 
+--------------+-------+--------+----------+ 

내가로 변환하고 싶습니다을 다음 내가 생각할 수있는

+--------------+---------+ 
| attribute_id | keyword | 
+--------------+---------+ 
|   1 | red  | 
|   2 | blue | 
|   3 | pink | 
|   1 | honda | 
|   2 | bmw  | 
|   3 | skonda | 
|   1 | cars | 
|   2 | cars | 
|   3 | vans | 
+--------------+---------+ 

유일한 방법은이 같은 UNION의를 사용하는 것입니다 :

SELECT attribute_id, color from attributes 
UNION ALL 
SELECT attribute_id, brand from attributes 
UNION ALL 
SELECT attribute_id, category from attributes 

위의 방법은 약간의 번거로운 작업입니다. 특히 실제 사용 사례가 각각 여러 테이블을 조인해야하므로 고르다.

복사/붙여 넣기가 더 간단합니까?이 글을 쓰는 방법은 무엇입니까?

+1

더 중요한 것은 * 데이터로 무엇을하려고합니까? – Kermit

+0

@FreshPrinceOfSO - 열이 많은 테이블이 잘못 설계되었으므로 새로 만든 키워드 테이블을 채우고 싶습니다. 원래 표의 각 열을 키워드로 사용하겠습니다. – Drahcir

+0

난 테이블에서 정상적으로 *를 선택하고 대신에 사용하는 언어로 처리 할 것입니다. –

답변

3

(적어도 큰 테이블에 대한) 더 효율적인 쿼리입니다 : 이것은 union all 쿼리보다 더

SELECT attribute_id, 
     (case when n = 1 then color 
      when n = 2 then brand 
      when n = 3 then category 
     end) as keyword 
from attributes a cross join 
    (select 1 as n union all select 2 union all select 3) n; 

이유는 성능이다. union all은 원본 테이블을 세 번 스캔합니다. 원본 테이블을 한 번 스캔 한 다음 n을 반복합니다. 큰 테이블의 경우 이는 성능에서 중요한 차이 일 수 있습니다.

+0

굉장한, 기술에 감사드립니다. 전에 십자가 조인에 대한 사용을 결코 발견하지 못했습니다. – Drahcir