我该如何创建一个正确的UPDATE语句

时间:2017-01-12 00:06:16

标签: sql-server sql-update

我必须使用Table_B seq 字段中的值更新Table_A中的 Lseq 字段。

TABLE_A

ID  | OrderNumber  | Lseq | SKU  | CustOrdNumber
----+--------------+------+------+---------------
523 | DTCI102597-A |      | C123 | 102597-RPI
524 | DTCI102597-A |      | C123 | 102597-RPI
525 | DTCI102597-A |      | C123 | 102597-RPI

表-B

ID  | order_no     | seq   | sku
----+--------------+-------+---------
201 | DTCI102597-A | 16384 | C123
202 | DTCI102597-A | 32768 | C4302716
203 | DTCI102597-A | 49152 | C123
204 | DTCI102597-A | 65536 | C4302716
205 | DTCI102597-A | 81920 | C123
206 | DTCI102597-A | 98304 | C4302720

我的最终结果应该是

表-A

ID  | OrderNumber  | Lseq  | SKU  | CustOrdNumber
----+--------------+-------+------+--------------
523 | DTCI102597-A | 16384 | C123 | 102597-RPI
524 | DTCI102597-A | 49152 | C123 | 102597-RPI
525 | DTCI102597-A | 81920 | C123 | 102597-RPI

这是我当前的脚本无效,它不会返回所有Lseq数字。

UPDATE TABLE_A
SET LSeq = B.seq
FROM TABLE_B as B
INNER JOIN TABLE_A AS A ON A.OrderNumber = B.ORDER_NO
                        AND A.sku = B.sku

1 个答案:

答案 0 :(得分:1)

由于OrderNumber / SKU组合不是唯一的,因此您需要某种方式来连接行号上的行。表A中的第一个ID需要与表B中的第一个ID匹配,表A中的第二个ID需要与表B中的第二个ID匹配,等等。

实现此目的的一种方法是使用ROW_NUMBER()窗口函数。

例如,

UPDATE A
SET LSeq = B.Seq
FROM
(
    SELECT *,
        RN = ROW_NUMBER() OVER (PARTITION BY OrderNumber, SKU ORDER BY ID)
    FROM tableA
) A
JOIN
(
    SELECT *,
        RN = ROW_NUMBER() OVER (PARTITION BY order_no, SKU ORDER BY ID)
    FROM tableB
) B ON B.SKU = A.SKU 
    AND B.order_no = A.OrderNumber 
    AND B.RN = A.RN; -- First ID joins to first ID, second ID joins to second ID, etc.