1

我有一个类似于下面的数据集。

在此处输入图像描述

我需要根据 updated_CustomerId 列中提供的值更新基本查找表。基表与数据集相同,但没有 updated_CustomerId 列。

这里的挑战是基表具有基于以下三列组合的 唯一约束: Current_CustomerID
Order_ID OrderCategory

期望的输出:

在此处输入图像描述

更新后 Old_customerIds (17360410 - Pk 8, 21044488 - Pk = 9) 之一可以重新分配给 Update_CustomerID PrimaryKey 2 不会更新,因为这会导致违反唯一约束,但随后它将与其中一个一起删除上面的 PrimaryKeys 为 8 或 9,取决于更新了哪一个(重新分配给新的 id)

在基表上更新所有内容后,我从基表中删除所有未将 Current_CustomerID 重新分配给 updated_CustomerId 的记录(如果不同)

    IF OBJECT_ID('tempdb..#DataSet') IS NOT NULL
    DROP TABLE #DataSet


    IF OBJECT_ID('tempdb..#BaseTable') IS NOT NULL
    DROP TABLE #BaseTable

CREATE TABLE #DataSet
(
    PrimaryKey INT NOT NULL CONSTRAINT [PK_dataset_ID] PRIMARY KEY,
    Current_CustomerID INT NOT NULL,
    Order_ID INT NOT NULL,
    OrderCategory VARCHAR(50) NOT NULL,
    Updated_CustomerId INT NOT NULL
)
INSERT INTO #DataSet (PrimaryKey,   Current_CustomerID, Order_ID,   OrderCategory,  updated_CustomerId)
VALUES
(1, 17395001,   4451784,    'Kitchen',  25693110),
(2, 25693110,   4451784,    'Kitchen',  25693110),

(3, 25693110,   2083059,    'Kitchen',  25693110),
(4, 25693110,   2163679,    'Kitchen',  25693110),
(5, 25693110,   2171466,    'Kitchen',  25693110),

(6, 25693110,   2163679,    'Bathroom', 25693110),
(7, 25693110,   2171466,    'Bathroom', 25693110),

(8, 17360410,   3377931,    'Furniture',    16303984),
(9, 21044488,   3377931,    'Furniture',    16303984),

(10,    1534323,    2641714,    'Furniture',    16303984),
(11,    16303984,   2641726,    'Furniture',    16303984),
(12,    16303984,   2641793,    'Furniture',    16303984),
(13,    16303984,   2641816,    'Furniture',    16303984),

(14,    16303345,   2641816,    'Garden',   16301239),
(15,    12345678,   1239065,    'Medicine', 1075432)

CREATE TABLE #BaseTable
(
    PrimaryKey INT NOT NULL CONSTRAINT [PK_baseTable_ID] PRIMARY KEY,
    CustomerID INT NOT NULL,
    Order_ID INT NOT NULL,
    OrderCategory VARCHAR(50) NOT NULL,
)

CREATE UNIQUE NONCLUSTERED INDEX [IDX_LookUp] ON #BaseTable
(
    CustomerID ASC,
    Order_ID ASC,
    OrderCategory ASC
) ON [PRIMARY]


INSERT INTO #BaseTable (PrimaryKey, CustomerID, Order_ID,   OrderCategory)
VALUES
(1, 17395001,   4451784,    'Kitchen'),
(2, 25693110,   4451784,    'Kitchen'),

(3, 25693110,   2083059,    'Kitchen'),
(4, 25693110,   2163679,    'Kitchen'),
(5, 25693110,   2171466,    'Kitchen'),

(6, 25693110,   2163679,    'Bathroom'),
(7, 25693110,   2171466,    'Bathroom'),

(8, 17360410,   3377931,    'Furniture'),
(9, 21044488,   3377931,    'Furniture'),

(10,    1534323,    2641714,    'Furniture'),
(11,    16303984,   2641726,    'Furniture'),
(12,    16303984,   2641793,    'Furniture'),
(13,    16303984,   2641816,    'Furniture'),

(14,    16303345,   2641816,    'Garden'),
(15,    12345678,   1239065,    'Medicine')

-- select * from #BaseTable
-- select * from #DataSet

    ; with CTE AS (
    select a.*
        ,rank() over (partition by a.updated_CustomerId, a.Order_ID, a.OrderCategory
                                                 order by a.Current_CustomerID) as flag
    from #DataSet a
    )

with CTE AS (
select a.*
    ,rank() over (partition by a.updated_CustomerId, a.Order_ID, a.OrderCategory order by a.Current_CustomerID) as flag
from #DataSet a
)

update b
set CustomerID = a.Updated_CustomerId
from #BaseTable b 
inner join CTE a on b.PrimaryKey = a.PrimaryKey
where flag <> 2

消息 2601,级别 14,状态 1,第 82 行无法在具有唯一索引“IDX_LookUp”的对象“dbo.#BaseTable”中插入重复的键行。重复键值为 (25693110, 4451784, Kitchen)。该语句已终止。

4

1 回答 1

1

我认为您只想为#DataTable获取一个row_number,然后根据唯一键删除多个:

//...

DELETE  bt
FROM    #BaseTable bt
    INNER JOIN (
                SELECT  a.PrimaryKey,
                    a.Updated_CustomerId,
                    a.Order_ID,
                    a.OrderCategory,
                    row = ROW_NUMBER() OVER (PARTITION BY a.Updated_CustomerId, a.Order_ID, a.OrderCategory ORDER BY a.Current_CustomerID)
                FROM    #BaseTable b
                    INNER JOIN #DataSet a
                        ON b.PrimaryKey = a.PrimaryKey
            ) x
        ON bt.PrimaryKey = x.PrimaryKey
        AND x.row > 1
于 2019-11-11T20:45:38.670 回答