sql >> Databáze >  >> RDS >> Oracle

vložit do... vybrat ... s poddotazem nebo bez pořadí sloupců

Ne, nemůžete použít poddotaz ke generování seznamu sloupců jako součást příkazu SQL.

Úplný výpis můžete vygenerovat z datového slovníku:

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

a pak to buď zkopírujte a vložte, nebo použijte dynamické SQL z anonymního bloku:

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

S pár fiktivními tabulkami:

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

spuštění tohoto bloku dává:

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

Můžete také změnit tento anonymní blok na proceduru, která přebírá dva názvy tabulek, pokud je to něco, co pravděpodobně budete chtít dělat často (řekli jste, že to musí být znovu použitelné, ale to by mohlo znamenat pro stejné tabulky a mohlo by to být blok ve skriptu).

Můžete také jít dále a zahrnout pouze sloupce, které se objevují v obou tabulkách, nebo ověřit, že se datové typy přesně shodují; i když je to trochu více práce a možná to nebude nutné.




  1. Získávání dat z uložené procedury pomocí Entity Framework

  2. Data MySQL obsahují speciální znaky jako š a ć, ale zobrazují se jako '?' na webové stránce. Proč?

  3. Jaký je nejlepší způsob generování hodnocení v MYSQL?

  4. Jak umístit řádek nahoře v dotazu mysql.