CREATE AS SELECT *, но с одним столбцом, полученным из другой таблицы - PullRequest
0 голосов
/ 27 июня 2018

Мне нужно «воссоздать» более 50 таблиц (в Oracle) с помощью CREATE AS SELECT операторов. Однако во всех этих таблицах один столбец будет изменен с использованием данных из другой таблицы. Есть ли способ достичь этого без объявления каждого столбца в операторе SELECT?

Что-то вроде:

CREATE TABLE table_name_copy AS SELECT *, (SELECT col_name FROM other_table WHERE other_table.col_id = table_name.col_id) AS col_name FROM table_name`

В основном для всех таблиц у меня есть столбец, который необходимо заменить данными в столбце other_table.

Ответы [ 4 ]

0 голосов
/ 27 июня 2018

Я бы попробовал это (но у меня нет Oracle SQL для тестирования, поэтому, пожалуйста, оставьте мне преимущество сомнения)

CREATE TABLE table_name_copy AS 

SELECT * FROM (
               SELECT *, (SELECT col_name FROM other_table WHERE other_table.col_id = table_name.col_id) as col_name 

               FROM table_name`
               )

редактировать: затем запустите

ALTER TABLE table_name_copy DROP COLUMN <old column>
убрать столбец, который вам больше не нужен

0 голосов
/ 27 июня 2018

Может быть, вы можете использовать простое соединение и звездочку, чтобы вернуть все столбцы из первой таблицы, например:

CREATE TABLE table_name_copy AS 
  SELECT * FROM (
    SELECT tab1.*, tab2.column_name 
    FROM table_name tab1 LEFT JOIN other_table tab2 ON tab1.col_id = tab2.col_id
  );
0 голосов
/ 27 июня 2018

Если для обеих объединенных таблиц зафиксирован столбец col_id,

вы можете использовать user_tab_columns и user_tables представления словаря через схему для создания новых таблиц с именем " table_name _copy", используя следующий механизм:

declare
 v_ddl varchar2(4000); 
 v_cln varchar2(400); 
begin
 for c in ( select * 
              from user_tables t 
             where t.table_name in
             ( select c.table_name 
                 from user_tab_columns c
                where c.column_name = 'COL_ID'  ) 
             order by t.table_name )
 loop    
   v_ddl := 'create table '||c.table_name||'_copy as 
                      select ';
   for d in ( select listagg('t1.'||column_name, ',') within group ( order by column_name ) cln 
                from user_tab_columns 
               where table_name = c.table_name 
                 and column_name != 'COL_ID' )                   
   loop
    v_cln := v_cln||d.cln;  
   end loop;
       v_ddl := v_ddl||v_cln;                       
       v_ddl := v_ddl||', t2.col_id t2_id 
        from '||c.table_name||' t1 
        left outer join other_table t2 on ( t1.col_id = t2.col_id )';

       execute immediate v_ddl;                    
       v_ddl := null;
       v_cln := null;
 end loop;
end;
0 голосов
/ 27 июня 2018

Создайте строку SQL следующим образом:

SELECT 'CREATE TABLE table_name_copy AS SELECT '
    || LISTAGG (column_name, ', ') WITHIN GROUP (ORDER BY column_name)
    || ', (SELECT col_name FROM other_table 
           WHERE other_table.col_id = table_name.col_id) AS col_name'
    || ' FROM table_name'
FROM all_tab_cols
WHERE owner = 'OWNER'
AND table_name = 'TABLE_NAME'
AND column_name != 'COL_NAME'

Если вы хотите выполнить вышеприведенный оператор, вы можете использовать EXECUTE IMMEDIATE:

DECLARE
  v_sql VARCHAR2(10000);
BEGIN
  SELECT 'CREATE TABLE table_name_copy AS SELECT '
      || LISTAGG (column_name, ', ') WITHIN GROUP (ORDER BY column_name)
      || ', (SELECT col_name FROM other_table 
             WHERE other_table.col_id = table_name.col_id) AS col_name'
      || ' FROM table_name'
  INTO v_sql
  FROM all_tab_cols
  WHERE owner = 'OWNER'
  AND table_name = 'TABLE_NAME'
  AND column_name != 'COL_NAME';

  EXECUTE IMMEDIATE v_sql;
END;
/
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...