通过关系表更新表

时间:2019-09-02 09:15:51

标签: sql db2

我有一张表格,其中记录了以下季节得分,如 score_table 。 它记录了一个主题的三季得分S1,S2和S3。

有时候,可以通过让另一名受试者获得相同的季节得分来放弃一些季节得分和化妆,因此我们有 transfe_record 表来保存它。

所以问题是我该如何使用 transfe_record 和SQL(DB2)代码写回分数

谢谢!

score_table

|      key     |     subject   |     S1    |     S2    |     S3    |
+--------------+---------------+-----------+-----------+-----------|
|       1      |       A01     |     80    |    80     |     100   |
|       1      |       A02     |     78    |    98     |     null  |
|       1      |       A03     |     null  |    80     |     null  |
|       1      |       B01     |     null  |    null   |     null  |
|       1      |       B02     |     null  |    null   |     60    |
|       1      |       B03     |     66    |    null   |     null  |

transfe_record

|       key     |    org_sbj    |    trans_sbj   |
+---------------+---------------+----------------+
|        1      |      A02      |      B02       |
|        1      |      A03      |      B03       |

SQL之后,得分表应为

|      key     |     subject   |     S1    |     S2    |     S3    |
+--------------+---------------+-----------+-----------+-----------|
|       1      |       A01     |     80    |    80     |     100   |
|       1      |       A02     |     78    |    98     |     60    |
|       1      |       A03     |     66    |    80     |     null  |
|       1      |       B01     |     null  |    null   |     null  |
|       1      |       B02     |     null  |    null   |     60    |
|       1      |       B03     |     66    |    null   |     null  |

1 个答案:

答案 0 :(得分:2)

尝试一下:

merge into score_table a using
(
select t.key, t.org_sbj, b.S1, b.S2, b.S3
from transfe_record t
join score_table b on b.key=t.key and b.subject=t.trans_sbj
) m on m.key=a.key and m.org_sbj=a.subject  
and (a.S1 is null or a.S2 is null or a.S3 is null)
when matched then update set 
  S1=coalesce(a.S1, m.S1)
, S2=coalesce(a.S2, m.S2)
, S3=coalesce(a.S3, m.S3);

选择要插入到新表中的语句:

select 
  a.key, a.subject
, coalesce(a.S1, b.S1) as S1
, coalesce(a.S2, b.S2) as S2
, coalesce(a.S3, b.S3) as S3
from score_table a
left join transfe_record t on t.key=a.key and t.org_sbj=a.subject
left join score_table b on b.key=t.key and b.subject=t.trans_sbj;