DB2 SQL更新了超过1列与子查询相关的列

时间:2019-03-12 16:14:16

标签: db2 sql-update db2-luw correlated-subquery

我在DB2中是新手,但在SQL中不是新手,并且是与DB2 LUW V9.5中的子查询相关的DB2 SQL更新。我的表格如下:
enter image description here 在第3行和第7行中,我需要从第4行和第8行( SCD )更新ACTIVE = 0VALID_TO = VALID_FROM。我使用以下语句选择数据:

SELECT T2.COL1, T2.COL1_HIST, T2.ACTIVE, T2.VALID_FROM, T2.VALID_TO, T3.VALID_FROM
FROM TMP.TABLE01 T2 INNER JOIN 
(
    SELECT COL1, MAX(COL1_HIST) MAX_HIST FROM TMP.TABLE01 WHERE 
    ACTIVE = 1
    GROUP BY COL1
    HAVING Count(*)>1
)T1 ON T2.COL1 = T1.COL1 AND T2.COL1_HIST < T1.MAX_HIST
INNER JOIN TMP.TABLE01 T3 ON T1.COL1 = T3.COL1 AND T1.MAX_HIST = T3.COL1_HIST
WHERE T2.ACTIVE = 1

要在SQL世界中进行更新,我可以使用以下语句:

UPDATE T2 SET T2.ACTIVE = 0,T2.VALID_TO=T3.VALID_FROM
FROM TMP.TABLE01 T2 INNER JOIN 
(
    SELECT COL1, MAX(COL1_HIST) MAX_HIST FROM TMP.TABLE01 WHERE 
    ACTIVE = 1
    GROUP BY COL1
    HAVING Count(*)>1
)T1 ON T2.COL1 = T1.COL1 AND T2.COL1_HIST < T1.MAX_HIST
INNER JOIN TMP.TABLE01 T3 ON T1.COL1 = T3.COL1 AND T1.MAX_HIST = T3.COL1_HIST
WHERE T2.ACTIVE = 1

在DB2(DB2 LUW V9.5)世界中会怎样?
我知道堆栈溢出中的类似问题,但是它对我没有帮助:( link

非常感谢

1 个答案:

答案 0 :(得分:2)

尝试一下:

merge into table01 a using 
(
select rownumber() over(partition by col1 order by col1_hist desc) rn_, t.* 
from table01 t
where active=1
) m on m.rn_=1 and a.active=1 and a.col1=m.col1 and a.col1_hist<>m.col1_hist
when matched then update set active=0, valid_to=m.valid_from;
对于具有相同rn_的一组记录,内部子选择的

1列的值col1_hist对于具有最高col1的每一行。
对于每个组,我们将使用除正确的valid_from值以外的其他所有活动行来更新。