【问题标题】:Input selected row and ignore duplicate row输入选定行并忽略重复行
【发布时间】:2021-07-29 11:24:27
【问题描述】:

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

例如,我这里有 3 张桌子。

  1. 源表 AS Table_Source
  2. 目标表 AS Table_Destination
  3. 日志表 AS Table_Log

我的问题是,我的 Source Table 和 Destination Table 没有任何 PK 可用于 Row 表的标识。

  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后,会将最新活动表中的记录保存到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处插入了新数据
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 的最新表中可以看到,有一个重复的数据('Clock', 'Benefical', '2020-04-15', '2020-06-03') 具有不同的last_update。就我而言,我想排除这个重复的数据以插入我的Table_Destination,所以它只会插入('Poster', 'Maniac Shop', '2020-04-27', '2020-06-03'),当然我使用最新的last_transaction_productlast_update 来自Table_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;

注意:

  • 这是插入我的数据Data Inserting Flow的流程
  • 我不希望这种逻辑使用NOT INNOT EXISTS 查询,因为在我的情况下,我有来自Table_SourceTable_Destination 的1000 万行。因为它会让我的数据库工作太辛苦。

【问题讨论】:

  • 你好,我只是想补充一点:你应该使用SELECT ts.*而不是SELECT *

标签: sql sql-server date sql-server-2008 duplicates


【解决方案1】:

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

如果您遇到数百万行的问题,您应该检查您的索引。 Table_Destination haha​​hahas 没有重复的 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;

【讨论】:

  • 哦,对不起,我现在更新了我的 T-SQL,但现在我的问题是,如何检查我的索引?我需要加入两个表,然后将其插入Table_Destination?
  • 好的,我会试试你的建议
  • 我已经尝试过您赠送的查询。但是,当我添加具有相同 product_name 和不同 shop_name 的 Table_Source 时,它只插入 Printer 行。例如有 3 个新行 ('Clock', 'Benefical', '2020-04-15', '2020-06-05')('Clock', 'WatchId', '2020-04-02', '2020-06-05')('Printer', 'Hinezo Computer', '2020-04-20', '2020-06-05')。从这 3 行开始,它只插入('Printer', 'Hinezo Computer', '2020-04-20', '2020-06-05')。但是,我真的很感谢你的回答。谢谢
  • 但不是您要求插入Table_Destination中已经存在的产品吗?
  • 很抱歉我的更新迟了。非常感谢您的更新。现在解决了。
猜你喜欢
  • 1970-01-01
  • 2019-04-10
  • 2012-08-25
  • 2016-03-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多