输入选定行并忽略重复行

Input selected row and ignore duplicate row

我有一个问题,我需要根据 last_update 数据或 last_transaction_product 将选定的行从 table 插入到另一个 table。 last_update 是从 table 更新的数据,而 last_transaction_product 是我商店的最新交易,然后我的行有重复数据但这里有不同的 last_update 列,不能将此重复数据插入到我的目的地 table 此处,因为数据已经插入到目的地 table.

比如我这里有3个table

  1. 来源Table AS Table_Source
  2. 目的地 Table AS Table_Destination
  3. 日志Table AS Table_Log

我的问题是,我的源 Table 和目标 Table 没有任何可用于行 table 标识的 PK

  1. 这是我的 Table_Source
product_name shop_name last_transaction_product last_update
Clock Benefical 2020-04-15 2020-06-01
Monitor Hinezo Computer 2020-01-17 2020-06-01
Notebook LA Shop 2020-03-25 2020-06-01
  1. 我有一个基于 > @last_transaction_product> @last_update 将其插入到 Table_Destination 的查询,这是从 Table_Source 插入后我的 Table_Destination,以及我是在2020-06-02插入的
product_name shop_name last_transaction_product last_update
Clock Benefical 2020-04-15 2020-06-01
Monitor Hinezo Computer 2020-01-17 2020-06-01
Notebook LA Shop 2020-03-25 2020-06-01
  1. 插入我的Table_Destination后,会保存最近的activitytable到Table_Log的记录,所以这里我的Table_Log之后已插入。
table_name last_transaction_product last_update last_run
Table_Source 2020-04-15 2020-06-01 2020-06-02
  1. 而下一次,在 Table_Source
  2. 处插入了新数据
product_name shop_name last_transaction_product last_update
Clock Benefical 2020-04-15 2020-06-01
Monitor Hinezo Computer 2020-01-17 2020-06-01
Notebook LA Shop 2020-03-25 2020-06-01
Poster Maniac Shop 2020-04-27 2020-06-03
Clock Benefical 2020-04-15 2020-06-03
  1. 正如您从 Table_Source 的最新 table 中看到的那样,存在具有不同 last_update 的重复数据 ('Clock', 'Benefical', '2020-04-15', '2020-06-03')。在我的例子中,我想排除这个重复的数据插入我的 Table_Destination,所以它只会插入 ('Poster', 'Maniac Shop', '2020-04-27', '2020-06-03'),当然我使用最新的 last_transaction_productlast_updateTable_Log 作为我的参数插入 Table_Destination 。所以我的Table_Destination和我的Table_Log会是这样的。
product_name shop_name last_transaction_product last_update
Clock Benefical 2020-04-15 2020-06-01
Monitor Hinezo Computer 2020-01-17 2020-06-01
Notebook LA Shop 2020-03-25 2020-06-01
Poster Maniac Shop 2020-04-27 2020-06-03
table_name last_transaction_product last_update last_run
Table_Source 2020-04-15 2020-06-01 2020-06-02
Table_Source 2020-04-27 2020-06-03 2020-06-04

这是我的T-SQL现在

BEGIN
    -- INSERT DESTINATION DATA --
    SET Table_Destination ON;
    INSERT INTO 
        Table_Destination
    SELECT 
        *
    FROM 
        Table_Source
    WHERE 
        last_transaction_product > (SELECT MAX(last_transaction_product) FROM Table_Log WHERE table_name = 'Table_Source')
        OR
        last_update > (SELECT MAX(last_update) FROM Table_Log WHERE table_name = 'Table_Source')

    SET Table_Destination OFF;

    -- INSERT LOG UPDATE --
    INSERT INTO Table_Log(table_name, last_transaction_product, last_update, last_run)
    VALUES('Table_Source', (SELECT MAX(last_transaction_product) FROM Table_Source WHERE table_name = 'Table_Source'), (SELECT MAX(last_update) FROM Table_Source WHERE table_name = 'Table_Source'),  @Date)
END;

注:

你应该使用 NOT EXISTS,这是你最好的选择,因为半连接。

如果您遇到数百万行的问题,您应该检查您的索引。 Table_Destination has 没有 product_name 的重复项,因此对其进行索引(在两个表中)是一个好的开始,并且对它的连接应该不是很好。

此外,您的 WHERE 子句有些奇怪..

我会试试这个

编辑

NOT EXISTS 中添加了一个条件,使每个商店的产品在目的地中插入一次,而不是只插入一次。

Table_Log 为空时,也为第一个 运行 添加了保护。

SET Table_Destination ON;

INSERT INTO 
    Table_Destination
SELECT 
    *
FROM 
    Table_Source ts,
    (
        SELECT 
            MAX(last_transaction_product) max_last_transaction_product, 
            MAX(last_update) max_last_update 
        FROM Table_Log 
        WHERE table_name = 'Table_Source'
    ) agg
WHERE 
    (
        last_transaction_product > ISNULL(max_last_transaction_product, 0)
        OR 
        last_update > ISNULL(max_last_update, 0)
    )
    AND
    NOT EXISTS (
        SELECT NULL 
        FROM Table_Destination td
        WHERE td.product_name = ts.product_name
        /* REMOVE BELOW LINE IF YOU NEED PRODUCTS IN DEST ONLY ONCE
        KEEP THE LINE IF YOU WANT PRODUCT REPEATED ONCE FOR EACH SHOP */
        AND td.shop_name = ts.shop_name 
    )

SET Table_Destination OFF;