首页 > 解决方案 > SQL中的多对一行更新?

问题描述

所以我试图将临时表中的数据更新到主表中。

我们将这些表称为临时表和服务表。

伪代码将是这样的......

Sort temp by inserted_on

When service_id and location match in both tables:

   If temp.column1 is not null, replace services.column1
   If temp.column2 is not null, replace services.column2
   etc...

虽然我在临时表中有多个与条件匹配的源行时,但并非所有字段都在更新,但我已经完成了这一工作。

例如,我可能有两行具有相同的 service_id 和位置,其中一行 column1 为空,column2 有一个值,而下一行则相反。我需要按照它们进来的顺序一一更新,并在必要时覆盖旧数据。

我还需要加入 UPDATE 中的临时表来检索我匹配的键。

我试过下面的代码,但它似乎只更新了某些行,我不太清楚它背后的逻辑是什么。

我不担心订单,我只是想弄清楚为什么当有数据准备好填补空白时它会留下一些空白。

UPDATE  sloc

    SET     

    sloc.ata =          COALESCE(tmp.ata, sloc.ata),
    sloc.atd =          COALESCE(tmp.atd, sloc.atd),
    sloc.atp =          COALESCE(tmp.atp, sloc.atp),
    sloc.eta =          COALESCE(tmp.eta, sloc.eta),
    sloc.etd =          COALESCE(tmp.etd, sloc.etd),
    sloc.etp =          COALESCE(tmp.etp, sloc.etp),
    sloc.plat =         COALESCE(tmp.plat, sloc.plat),
    sloc.plats_up =     COALESCE(tmp.plats_up, sloc.plats_up),
    sloc.cis_plats_up = COALESCE(tmp.cis_plats_up, sloc.cis_plats_up)

    FROM
            services_locations sloc
            INNER JOIN services svc ON svc.id = sloc.sid
            INNER JOIN ref_tiploc tloc ON tloc.id = sloc.tpl_id
            INNER JOIN trainstatus_tmp tmp ON svc.rid = tmp.rid AND tloc.tpl = tmp.tpl

标签: sqlsql-serversql-update

解决方案


推荐阅读