sql >> Databasteknik >  >> RDS >> Oracle

infoga i... välj ... med underfråga eller utan kolumnordning

Nej, du kan inte använda en underfråga för att generera kolumnlistan som en del av en SQL-sats.

Du kan generera hela uttalandet från dataordboken:

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';

och sedan antingen kopiera och klistra in det, eller använd dynamisk SQL från ett anonymt block:

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;
/

Med ett par dummybord:

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

att köra det blocket ger:

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

Du kan också förvandla det där anonyma blocket till en procedur som tar två tabellnamn om det här är något du sannolikt kommer att vilja göra ofta (du sa att det behövde återanvändas, men det kan betyda för samma tabeller, och kan bara vara ett block i ett skript).

Du kan också gå längre och bara inkludera kolumner som visas i båda tabellerna, eller verifiera att datatyperna matchar exakt; även om det är lite mer jobb och kanske inte är nödvändigt.




  1. MySQLi-uppdatering förberedd uttalande uppdaterar inte databasen

  2. Mysql AVG för att ignorera noll

  3. Ta bort dubbletter från en tabell och länka om referensrader till den nya mastern

  4. Datageneratorer för SQL-server?