Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 如何仅使用临时表中的一个公共ID,使用另一个表中的多个值更新临时表中的多个行?_Sql Server_Tsql_Sql Update_Temp Tables - Fatal编程技术网

Sql server 如何仅使用临时表中的一个公共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

我试图将临时表(顶部)中的ID与另一个DB表(底部)中的ID进行协调。因为我只有一个ID,这两个ID是相同的,所以我只能得到temp表中所有行(ReconGlobalRemunerationGrantID)的最高结果。我的目标是获得每个唯一的ID并更新我的临时表

现在,我的更新查询很简单,我使用两个表之间的公共ID进行更新。我是否可以使用函数或其他命令语句来获得预期的结果

从@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