2014-01-17 4 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

Более эффективный запрос (по крайней мере, для больших таблиц) является:

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 запрос является производительность. union all будет сканировать исходную таблицу три раза. Это сканирует исходную таблицу один раз (и затем прокручивается через n). Для большой таблицы это может быть существенной разницей в производительности.

+0

Удивительный, спасибо за технику. Раньше я никогда не встречал использование кросс-соединений. – Drahcir

Смежные вопросы