我正在尝试更新具有多列的表(Table1)..
id Engine Transmission Exhaust Axle
-- ------- ------- -------- ------
1 CC NX1 BP1 F1
2 C1 NX2 BP2 F2
3 C2 NX3 BP3 F3
我想使用表2中的名称和值来更新此表...
id Name Value
-- ------- -------
1 Engine C4
2 Transmission NX4
3 Exhaust BP5
4 Axle F4
基于ID,很容易加入这两个表。但是有可能动态地“动态地”#39;使用Table2.Name使用Table2.Value更新Table1中的列。一些如何使用Table2.Name知道Table1中的哪一列将使用Table2.Value?
更新到目前为止,我只能想到一个基本的SELECT来根据WHERE EXISTS提取我正在寻找的数据:
SELECT * FROM table1 t1
Where exists (Select NULL
from scpomgr.table2 t2
WHERE t1.id = t2.id);
结果将是table1:
id Engine Transmission Exhaust Axle
-- ------- ------- -------- ------
1 C4 NX1 BP1 F1
2 C1 NX4 BP2 F2
3 C2 NX3 BP5 F3
4 C3 NX5 BP4 F4
答案 0 :(得分:0)
您可以先尝试对Table2进行透视,使其与Table1具有相同的列,然后使用连接执行常规更新。顺便说一句 - 您确定可以通过Id加入两个表吗?在我的解决方案中,我向Table1添加了一个外键(Table1Id)。
我的解决方案适用于Sql Server,但Oracle的逻辑应该相同。
with t2Pivot as (
select Table1Id, Engine, Transmission, Exhaust, Axle
from (
select Table1Id, Name, Value
from Table2
) as s
pivot (
min(Value) for Name in (Engine, Transmission, Exhaust, Axle)
) as p
)
update t1 set
Engine = isnull(t2.Engine, t1.Engine),
Transmission = isnull(t2.Transmission, t1.Transmission),
Exhaust = isnull(t2.Exhaust, t1.Exhaust),
Axle = isnull(t2.Axle, t1.Axle)
from Table1 t1 left join t2Pivot t2 on (t1.Id = t2.Table1Id)