问题描述
我正在尝试协调另一个数据库表(底部)中的临时表(顶部)中的ID。由于我只有一个在两者之间共有的ID,因此我只会得到临时表中所有行的最高结果(ReconGlobalRemunerationGrantID)。我的目标是获取每个唯一的ID,并以此来更新我的临时表。
现在,我的更新查询很简单,我使用两个表之间的公共ID进行更新。是否可以使用函数或其他命令语句来获得预期的结果?
update tgrg set ReconGlobalRemunerationGrantID = grg.GlobalRemunerationGrantID from @GlobalRemunerationGrant tgrg
join @GlobalRemuneration tgr on tgr.GlobalRemunerationID = tgrg.GlobalRemunerationID
join DataCore..GlobalRemuneration gr on gr.CompanyID = @CompanyID and gr.FiscalYearID = tgr.FiscalYearID and gr.DirectorDetailID = tgr.DirectorDetailID and tgr.GlobalRoleIDCODE = gr.GlobalRoleID
join DataCore..GlobalRemunerationGrant grg on gr.GlobalRemunerationID = grg.GlobalRemunerationID
谢谢。
解决方法
基于注释-您有2个值要匹配,而不仅仅是一个?例如GlobalRemunerationID和GlobalRemunerationGrantID?
这是使用表“ temptable”和“ t1”的示例
UPDATE temptable
SET ReconGlobalRemunerationGrantID = t1.GlobalRemunerationGrantID
FROM temptable
INNER JOIN t1 ON temptable.GlobalRemunerationID = t1.GlobalRemunerationID
AND temptable.GlobalRemunerationGrantID = t1.GlobalRemunerationGrantID
在下面更新
以下版本采用两个数据集
- 按GlobalRemunerationID对其进行分区,并按ReconGlobalRemunerationGrantID对其进行排序以获取“行号”(rn)
- 将他们加入GlobalRemunerationID并按rn顺序获取它们
下面是键控代码(抱歉,表与您的完整表略有不同-匹配您提供的数据集)。
; WITH tgrg AS
(SELECT GlobalRemunerationID,ReconGlobalRemunerationGrantID,ROW_NUMBER() OVER (PARTITION BY GlobalRemunerationID ORDER BY GlobalRemunerationGrantID) AS rn
FROM #GlobalRemunerationGrant
)
UPDATE tgrg
SET ReconGlobalRemunerationGrantID = tgr.GlobalRemunerationGrantID
FROM tgrg
INNER JOIN
(SELECT GlobalRemunerationID,GlobalRemunerationGrantID,ROW_NUMBER() OVER (PARTITION BY GlobalRemunerationID ORDER BY GlobalRemunerationGrantID) AS rn
FROM GlobalRemuneration
) AS tgr ON tgrg.GlobalRemunerationID = tgr.GlobalRemunerationID AND tgrg.rn = tgr.rn
那里有全套db<>fiddle-请注意,我更改了一些ID以证明它不是在使用它们进行匹配。