使用sql / plsql插入数据

时间:2016-05-06 12:56:51

标签: sql oracle plsql

我有一个包含以下数据的基表

表1

:skip_digest: true

我需要输出表" test"有以下细节

NUMBER      TYPE        DATE
1           ABC         2015-05-05 10:00:00
1           XYZ         2015-05-05 11:00:00

我在下面尝试过,但它没有用。我是sql plsql的新手。

id  T1          TYPE_1  T2          TYPE_2
1   10:00:00    ABC     11:00:00    XYZ

2 个答案:

答案 0 :(得分:1)

你所拥有的是所谓的upsert:在目标表中插入或更新一行,具体取决于它是否与源表中的行匹配。在Oracle中,我们可以使用MERGE语句在纯SQL中实现这一点:

merge into test
using ( select abc.number, abc.type as type_1, abc.date as t1
                , xyz.type as type_2, xyz.date as t2
         from table_1 abc
              join table_2 xyz
               on abc.number = xyz.number 
         where abc.type = 'ABC'
         and xyz.type = 'XYZ'
       ) t
on ( test.number = t.number
when not matched then
    insert (t.number, t.type_1, t.t1, t.type_2, t.t2)
when matched then
    update set test.t1 = t.t1
              , test.t2 = t.t2
/

USING子句中的子查询使用从所需输出推断的逻辑将两行划分为一行。您可能需要扩展此查询,具体取决于您将场景简化为多少以在此处发布。

答案 1 :(得分:0)

如果表中仅存在'ABC'和'XYZ'类型,请尝试此操作:

SELECT number as id,
       MAX(CASE WHEN Type = 'ABC' THEN Date ELSE NULL END) as T1,
       MAX('ABC') as Type_1,
       MAX(CASE WHEN Type = 'XYZ' THEN Date ELSE NULL END) as T2,
       MAX('XYZ') as Type_2
FROM T   
GROUP BY Number