繁体   English   中英

通过存储过程更新数据

[英]Updating data via stored procedure

我有两个表(表1和表2),如下所示。 我想在获取表1中的数据时更新表2中的列。

表格1

+-----------+---------------+---------------------+
+  form_id  +   request_id  +         BatchNo     +
+-----------+---------------+---------------------+
+  5649464  +      562      +     Batch5649464_1  +
+-----------+---------------+---------------------+
+  5649464  +      563      +     Batch5649464_11 +
+-----------+---------------+---------------------+

表2

+------------+---------------+-----------+
+  NumberId  +   ServiceName +    RefId  +
+------------+---------------+-----------+
+  5649464   +      XYZ      +     0     +
+------------+---------------+-----------+
+  5649464   +      XYZ      +     0     +
+------------+---------------+-----------+

在表1中,按照上面的列表有两行。 默认情况下,我的RefId为0.我必须使用表1中的数据(request_id)更新该列。 如您所见,request_id有两个不同的数据。 数据(562和563)应根据我的预期输出进行更新。 但是现在我按照初始输出得到了结果。 根据我的预期输出,任何人都可以帮忙吗?

DECLARE @Tempnumbers TABLE
            (
              form_id INT ,
              request_id INT
            );

         ;
        WITH    Result
                  AS ( SELECT   form_id ,
                                CONVERT(BIGINT, ( CONVERT(VARCHAR, request_id) )) AS request_id
                       FROM     [Table1] 
                     )
            INSERT  INTO @Tempnumbers
                    SELECT  form_id, request_id
                    FROM    Result;

        UPDATE  DT
        SET    RefID = request_id
       FROM    Table2 DT 
       INNER JOIN @Tempnumbers TN ON TN.NumberId = DT.form_id;

初始输出

+------------+---------------+-----------+
+  NumberId  +   ServiceName +    RefId  +
+------------+---------------+-----------+
+  5649464   +      XYZ      +     562   +
+------------+---------------+-----------+
+  5649464   +      XYZ      +     562   +
+------------+---------------+-----------+

预期产出

+------------+---------------+-----------+
+  NumberId  +   ServiceName +    RefId  +
+------------+---------------+-----------+
+  5649464   +      XYZ      +     562   +
+------------+---------------+-----------+
+  5649464   +      XYZ      +     563   +
+------------+---------------+-----------+

您可以使用ROW_NUMBER()连接表并更新RefId

;WITH cte1 AS (
    SELECT  *,
            ROW_NUMBER() OVER (PARTITION BY form_id ORDER BY request_id) as rn
    FROM Table1 t1
), cte2 AS (
    SELECT  *,
            ROW_NUMBER() OVER (PARTITION BY NumberId ORDER BY RefId) as rn
    FROM Table2 t2
)

UPDATE c2
SET RefId = c1.request_id
FROM cte1 c1
INNER JOIN cte2 c2
    ON c1.form_id = c2.NumberId AND c1.rn = c2.rn

如果您从Table2选择,您将获得:

NumberId    ServiceName RefId
5649464     XYZ         562
5649464     XYZ         563

Table2没有主键,因此您不能使用一个值更新第一行,而使用不同值更新第二行,除非您将主键添加到table2

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM