Oracle
 sql >> база данни >  >> RDS >> Oracle

вмъкване в... изберете ... с подзаявка или без ред на колони

Не, не можете да използвате подзаявка за генериране на списъка с колони като част от SQL оператор.

Можете да генерирате пълния израз от речника на данните:

select 'insert into cl ("'
  || listagg(column_name, '","') within group (order by column_id)
  || '") select "'
  || listagg(column_name, '","') within group (order by column_id)
  || '" from clt'
from user_tab_columns where table_name = 'CLT';

и след това или копирайте и поставете това, или използвайте динамичен SQL от анонимен блок:

declare
  stmt varchar2(4000);
begin
  select 'insert into cl ("'
    || listagg(column_name, '","') within group (order by column_id)
    || '") select "'
    || listagg(column_name, '","') within group (order by column_id)
    || '" from clt'
  into stmt
  from user_tab_columns where table_name = 'CLT';

  dbms_output.put_line(stmt); -- to check and debug
  execute immediate stmt;
end;
/

С няколко фиктивни таблици:

create table clt (col1 number, col2 date, col3 varchar2(10));
create table cl (col3 varchar2(10), col1 number, col2 date);

insert into clt (col1, col2, col3) values (42, date '2018-07-12', 'Test');

insert into cl
select * from clt;

SQL Error: ORA-00932: inconsistent datatypes: expected NUMBER got DATE

стартирането на този блок дава:

insert into cl ("COL1","COL2","COL3") select "COL1","COL2","COL3" from clt

PL/SQL procedure successfully completed.

select * from cl;

COL3             COL1 COL2      
---------- ---------- ----------
Test               42 2018-07-12

Можете също така да превърнете този анонимен блок в процедура, която приема две имена на таблици, ако това е нещо, което е вероятно да искате да правите често (вие казахте, че трябва да се използва многократно, но това може да означава за едни и същи таблици и може просто да бъде блок в скрипт).

Можете също да отидете по-далеч и да включите само колони, които се появяват в двете таблици, или да проверите дали типовете данни съвпадат точно; въпреки че това е малко повече работа и може да не е необходимо.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. EF и TransactionScope както за SQL Server, така и за Oracle без ескалиране/обхват до DTC?

  2. JFreeChart използва цифрова заявка ORACLE

  3. Как да добавите бутон за редактиране към всеки ред в отчет в Oracle APEX?

  4. Oracle:възползвайте се от използването на два индекса

  5. Изходът на Oracle е различен в SQL Developer и excel