【问题标题】:Updating multiple columns in a table based on two columns in another table根据另一个表中的两列更新表中的多列
【发布时间】:2016-02-19 10:46:46
【问题描述】:

我正在尝试更新具有多列的表(Table1)..

id     Engine      Transmission     Exhaust      Axle
--     -------       -------        --------    ------
1        CC              NX1           BP1       F1
2        C1              NX2           BP2       F2
3        C2              NX3           BP3       F3

我想使用 Table2 中的名称和值更新此表...

id     Name                Value     
--     -------            -------       
1       Engine              C4          
2       Transmission        NX4          
3       Exhaust             BP5         
4       Axle                 F4

仅基于 ID 即可轻松连接这两个表。但是是否可以使用 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

【问题讨论】:

  • 你能告诉我们你到目前为止做了什么吗?您确定我们可以按 ID 列连接两个表吗?
  • 那么更新的结果会是什么?
  • 我不认为它是带有内部联接的更新语句的副本。作为此查询,您需要更新 Table1。 Engine、Table1.Transmission、Table1.Exhaust 和 Table1.Axle:基于 Table2.Name 中的名称。

标签: sql oracle


【解决方案1】:

您可以先尝试对 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

【讨论】:

    猜你喜欢
    • 2014-06-23
    • 2011-11-25
    • 2017-07-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多