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

Нетривиално сливане на две таблици

Не казвате дали искате да се обедините в една от съществуващите таблици или в нова таблица. Но така или иначе не е "нетривиално".

Ако искате да вмъкнете набор от данни от една от съществуващите таблици в другата, използвайте MERGE (уликата е във въпроса).

SQL> select * from t1;

        ID TS             MONEY
---------- --------- ----------
         1 25-JUL-09        123
         2 04-AUG-09         67

SQL> select * from t2;

        ID TS             MONEY
---------- --------- ----------
         2 08-AUG-09         67
         3 10-AUG-09        787

SQL> merge into t1
  2     using   t2
  3     on ( t1.id = t2.id )
  4     when matched then
  5          update set ts = ts + ((t2.ts - t1.ts) / 2)
  6     when not matched then
  7          insert
  8             (id, ts, money)
  9     values
 10              (t2.id, t2.ts, t2.money)
 11  /

2 rows merged.

SQL> select * from t1
  2  /

        ID TS             MONEY
---------- --------- ----------
         1 25-JUL-09        123
         2 10-AUG-09         67
         3 10-AUG-09        787

SQL>

Ако искате да вмъкнете и двата набора от данни в нова таблица, можете да го направите по следния начин:

SQL> insert all
  2      when t1_id = t2_id then
  3          into t3 values (t1_id, t1_ts + ((t2_ts - t1_ts)/2), t1_money)
  4      when t1_id is not null and t2_id is null then
  5          into t3 values (t1_id, t1_ts, t1_money)
  6      when t1_id is null and t2_id is not null then
  7          into t3 values (t2_id, t2_ts, t2_money)
  8  select t1.id as t1_id
  9         , t1.ts as t1_ts
 10         , t1.money as t1_money
 11         , t2.id as t2_id
 12         , t2.ts as t2_ts
 13         , t2.money as t2_money
 14  from t1 full outer join t2 on t1.id = t2.id
 15  /
SQL> select * from t3
  2  /

        ID TS             MONEY
---------- --------- ----------
         2 06-AUG-09         67
         1 25-JUL-09        123
         3 10-AUG-09        787

SQL>


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Деактивирайте тригерите и активирайте отново тригерите, но междувременно избягвайте промяна на таблицата

  2. Oracle LISTAGG() за множество атрибути?

  3. Заредете огромен csv файл в таблицата на базата данни на oracle с помощта на Pyspark

  4. Как да възстановите данните в таблица на Oracle?

  5. Въздействие от дефинирането на колона VARCHAR2 с по-голяма дължина