使用另一个表的字段更新表的字段,以将其映射到Postgresql中的第三个表

时间:2016-02-08 18:19:05

标签: postgresql join sql-update case talend

enter image description here

我有3个表:地标,反式和输出。模式是测试模式。 绿色是表格,蓝色突出显示的是列。可以在国家和地区之间进行映射。
我有home_country现在有一个home_region为null。我需要找到home_country的home_region的值,该home_country的home region为null。

表格应该更新
如果 landmark.pgs_country = output.home_country ,则设置landmark.region = output.home_region。

但是,如果输出表中的国家 US-GM landmark - country_name 无法匹配,那么它应该 使用 trans table 将其映射以检查

如果 output.home_country = trans.ib_country ,则将trans.xperia_country用于该匹配,并将其与landmark.country_name等同,即 trans.xperia_country = landmark.country_name 设置landmark.region = output.home_region 以查找国家US-GM的home_region。 所以基本上更新必须设置landmark.region = output.home_region

如何为输出表更新此内容?

1 个答案:

答案 0 :(得分:0)

像这样:

WITH possible_joins AS (
SELECT
    o.home_country
    , COALESCE(l1.region, l2.region) AS region
FROM
    output o
    LEFT JOIN landmark l1 ON l1.pgs_country = o.home_country
    LEFT JOIN trans t ON t.ib_country = o.home_country
    LEFT JOIN landmark l2 ON l2.country_name = t.xperia_country
WHERE
    o.home_region IS NULL
) 
UPDATE
    output o
SET
    home_region = p.region
FROM
    possible_joins p
WHERE
    o.home_country = p.home_country
    AND o.home_region IS NULL;

如果您可以在模型中定义更多规则,这可以更简单的方式完成,这意味着强加更好的完整性。我显然没有说'你必须这样做,我甚至认为你不能(或者这个洞可能是关于它的第一个工作)。我只是想解释一下,使用那些左连接,因为看起来你不能把任何事情视为理所当然。