我有一个包含以下数据的基表
表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
答案 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