基于另一个表中的两列更新表中的多个列

时间:2015-11-17 21:40:45

标签: sql oracle

我正在尝试更新具有多列的表(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

1 个答案:

答案 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)

sqlfiddle