SQL — перенос строк из некоторых столбцов таблицы в каждую запись в той же таблице

#sql

#sql

Вопрос:

Я использую платформу, которая принимает минимальные функции SQL для написания кода SQL. Функция UNPIVOT не может использоваться на платформе, поэтому я должен сделать это вручную. Я думаю о том, чтобы ОБЪЕДИНИТЬ ВСЕ, а затем ПЕРЕКРЕСТНО СОЕДИНИТЬ (что я пытался, но в итоге получил неверное количество записей. Пожалуйста, смотрите прилагаемое изображение.

Любая помощь / указатель будут высоко оценены!

введите описание изображения здесь

введите описание изображения здесь

Комментарии:

1. Какую СУБД вы используете ..? (un) поворот может измениться в зависимости от СУБД.

Ответ №1:

Я не знаю, как вы использовали UNION ALL , но это можно сделать следующим образом:

 select col1, col2, col3 as NewCol from Table1
union all
select col1, col2, col4 from Table1
  

Вы также можете использовать ORDER BY предложение, чтобы строки с одинаковыми col1 и col2 появлялись в последующих строках:

 select col1, col2, NewCol
from (
  select col1, col2, col3 as NewCol, 1 as ord from Table1
  union all
  select col1, col2, col4, 2 from Table1
) t
order by col1, col2, ord
  

Ответ №2:

Переносимый подход использует union all :

 select col1, col2, col3 as newcol from mytable
union all
select col1, col2, col4 from mytable
  

Если ваша база данных поддерживает боковые соединения (также вызываемые cross apply в некоторых базах данных) и values() , это можно упростить:

 select t.col1, t.col2, x.newcol
from mytable t
cross join lateral (values(col3), (col4)) x(newcol)
  

Ответ №3:

Вы можете использовать a cross join , но это требует некоторой case логики. Точный синтаксис зависит от базы данных, но что-то вроде этого:

 select t.col1, t.col2,
       (case when n.n = 1 then t.col3 else t.col4 end) as newcol
from t cross join
     (select 1 as n union all select 2) n;
  

Чтобы загрузить другую таблицу, вы должны выполнить одно из следующих действий:

  • insert в результате получается таблица, которая уже создана.
  • Используйте select into или create table as в зависимости от базы данных.

Если вас интересует порядок, вы можете добавить order by t.col1, t.col2, n.n .

В большинстве случаев подойдет простой union all подход (такой, как предлагает GMB). Этот подход требует двойного сканирования таблицы, что влечет за собой некоторые дополнительные накладные расходы. Однако, если «таблица» действительно представляет собой сложный запрос или представление, то обработка ее только один раз является большим преимуществом.

Комментарии:

1. Пожалуйста, объясните, почему это отклонено. Это точный ответ на вопрос, если я что-то не пропустил.

2. Спасибо за это. Какие изменения будут внесены в ваш код с учетом дополнительных столбцов, которые вы найдете во 2-м приложении под исходным? Это для сценария, в котором у вас есть более 2/3 столбцов таблицы1, которые вы хотите сохранить, и более 3 столбцов таблицы1, которые вы хотите перекрестно применить, как указано выше.