Sql server 如何仅使用临时表中的一个公共ID,使用另一个表中的多个值更新临时表中的多个行?
我试图将临时表(顶部)中的ID与另一个DB表(底部)中的ID进行协调。因为我只有一个ID,这两个ID是相同的,所以我只能得到temp表中所有行(ReconGlobalRemunerationGrantID)的最高结果。我的目标是获得每个唯一的ID并更新我的临时表 现在,我的更新查询很简单,我使用两个表之间的公共ID进行更新。我是否可以使用函数或其他命令语句来获得预期的结果Sql server 如何仅使用临时表中的一个公共ID,使用另一个表中的多个值更新临时表中的多个行?,sql-server,tsql,sql-update,temp-tables,Sql Server,Tsql,Sql Update,Temp Tables,我试图将临时表(顶部)中的ID与另一个DB表(底部)中的ID进行协调。因为我只有一个ID,这两个ID是相同的,所以我只能得到temp表中所有行(ReconGlobalRemunerationGrantID)的最高结果。我的目标是获得每个唯一的ID并更新我的临时表 现在,我的更新查询很简单,我使用两个表之间的公共ID进行更新。我是否可以使用函数或其他命令语句来获得预期的结果 从@globalRemuneOptionGrantTGRG更新tgrg集reconlobalRemuneOptionGra
从@globalRemuneOptionGrantTGRG更新tgrg集reconlobalRemuneOptionGrantId=grg.globalRemuneOptionGrantId
在tgr.globalRemomentId=tgrg.globalRemomentId上加入@globalRemomentTGR
在gr.CompanyID=@CompanyID和gr.FiscalYearID=tgr.FiscalYearID和gr.DirectorDetailID=tgr.DirectorDetailID和tgr.GlobalRoleIDCODE=gr.GlobalRoleID上加入DataCore..globalPayment
加入DataCore..GlobalRemunerationGrant gr.GlobalRemunerationID=grg.GlobalRemunerationID上的grg
谢谢。根据评论-您有两个值要匹配,而不是一个?e、 例如,GlobalRemunerationID和GlobalRemunerationGrantID 下面是一个使用表'tentable'和't1'的示例
UPDATE temptable
SET ReconGlobalRemunerationGrantID = t1.GlobalRemunerationGrantID
FROM temptable
INNER JOIN t1 ON temptable.GlobalRemunerationID = t1.GlobalRemunerationID
AND temptable.GlobalRemunerationGrantID = t1.GlobalRemunerationGrantID
更新如下 下面的版本采用这两个数据集
- 按GlobalRemouneOptionId对它们进行分区,并通过ReconGlobalRemouneOptionGrantId对它们进行排序,以获取“行号”(rn)
- 加入GlobalRemouneRationalID和rn,让他们井然有序
有一个完整的集合-注意,我更改了一些ID以证明它不存在;t使用它们进行匹配。对于上述数据,您的预期/期望输出是什么?e、 例如,对于临时表中的第一行,您希望在侦察中看到什么。。。领域对于第二行?@seanb recon字段的期望输出为第一行102895,第二行102896,第三行102905,依此类推。这些是db表中与ID匹配的GlobalRemunerationGrantID值。谢谢。查看您当前的
UPDATE
语句会很有帮助。我只有一个值要匹配,它是GlobalRemunerationID。我不能在temp表中使用GlobalRemunerationGrantID,因为每次都有一个值是不一致的。我希望用db表中的4个唯一值来更新temp表中4行的Recon字段,而不仅仅是重复的顶部结果。很抱歉给你带来了困惑。谢谢您的意思是:对于给定的GlobalRemunerationID,临时表中的行数与主表中的行数相等,但其他ID不匹配?你想做的是简单地把它们按顺序排列,例如,1到1,2到2,3到3,4到4(只是按授予的顺序,而不是实际值)?是的,这是正确的。对于给定的GlobalRemID,可以肯定的是,临时表和主表中的行数相等。我需要将主表中的实际授权id值放入临时表中的recon字段。我当前的update语句仅将主表中找到的第一个授权id应用于临时表中的所有有效行。我已更新解决方案以创建“行号”(在每个GlobalRemunerationID中),然后它将该id与行号匹配。表/别名与您的略有不同-这样做是为了简化。您需要在中添加其他表以获得完整答案。此外,如果可能,请避免在SQL Server中使用表变量,使用临时表(例如,使用CREATE TABLE#tentable
而不是DECLARE@tentable
。表变量没有统计信息,因此SQL Server假定它们只有一行,如果其中有很多行,则会对性能造成很大影响。
; 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