DB2 SQL更新与子查询相关的多于1列[duplicate]

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了DB2 SQL更新与子查询相关的多于1列[duplicate]相关的知识,希望对你有一定的参考价值。

这个问题在这里已有答案:

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

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)世界中? 我知道Stack Overflow中的类似问题,但它对我没有帮助:( link

提前谢谢了

答案

试试这个:

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值。

以上是关于DB2 SQL更新与子查询相关的多于1列[duplicate]的主要内容,如果未能解决你的问题,请参考以下文章

返回多于一列的 SQL 子查询

【DB2】SQL优化

DB2 中的合并查询

如何在 DB2 的单个更新语句中更新多个列

多行的 SQL db2 更新查询

数据库(比如MYSQL) ,表连结查询与子查询哪个效率高些? 为啥