如何在同一更新查询中多次更新同一记录?

时间:2015-10-17 19:40:33

标签: sql-server

我正在使用SQL Server 2012 / T-SQL,特别是Management Studio。

我提供了一个表格(我们称之为 trackingInfo ),如下所示:

po_no   tracking_no
1       ABC
2       DEF
2       GHI

我试图通过以下方式将tracking_no数据插入表格(我们称之为 purchaseOrders ):

po_no   notes
1       #ABC
2       #DEF, #GHI

(请注意,我无法更改我提供的 trackingInfo 数据或 purchaseOrders 表格中我尝试插入信息的结构。我是仅限于上述结构。)

我有一个更新查询,适用于数据集 trackingInfo 每个po_no只包含一个tracking_no的实例(例如po_no 1)。但是,如果每个po_no有多个tracking_no(例如上面有po_no 2),我正在使用的更新查询无法附加第二个tracking_no值。此更新查询位于底部。

我对搜索解决方案的搜索表明,我在同一更新查询中不止一次地更新同一记录的纯粹限制。但是,我找不到比下面更加迟钝的替代方案或解决方案。是否有相对简单的方法在同一更新中多次更新同一记录/字段?

UPDATE purchaseOrders
SET purchaseOrders.notes =
        CASE 
            WHEN CHARINDEX(trackingInfo.tracking_no,purchaseOrders.notes) > 0
                THEN purchaseOrders.notes -- If tracking_no is already in notes, don't insert it.
            WHEN len(purchaseOrders.notes) = 0 OR purchaseOrders.notes IS NULL
                THEN '#' + trackingInfo.tracking_no -- If notes is empty, insert the tracking_no.
            ELSE purchaseOrders.notes + ', #' + trackingInfo.tracking_no -- If something is in notes, but it's not the tracking_no, then append the tracking_no.
        END     
FROM purchaseOrders
INNER JOIN trackingInfo ON purchaseOrders.po_no = trackingInfo.po_no
;

1 个答案:

答案 0 :(得分:1)

您不需要在UPDATE查询中多次更新同一条记录。这可以作为基于集合的操作使用XML来完成,以便于连接:

CREATE TABLE dbo.trackingInfo(
      po_no int NOT NULL
    , tracking_no varchar(10)  NOT NULL
    );

CREATE TABLE dbo.purchaseOrders(
      po_no int NOT NULL
    , notes varchar(MAX)  NULL
    );

INSERT INTO dbo.trackingInfo VALUES
      (1, 'ABC')
    , (2, 'DEF')
    , (2, 'GHI');

INSERT INTO dbo.purchaseOrders (po_no) VALUES
      (1)
    , (2);

UPDATE  dbo.purchaseOrders
SET     notes = STUFF(( SELECT  ', #' + tracking_no
                        FROM    dbo.trackingInfo AS ti
                        WHERE   ti.po_no = purchaseOrders.po_no
                      FOR
                        XML PATH('')
                      ), 1, 2, '');