输入选定行并忽略重复行
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
- 来源Table AS
Table_Source
- 目的地 Table AS
Table_Destination
- 日志Table AS
Table_Log
我的问题是,我的源 Table 和目标 Table 没有任何可用于行 table 标识的 PK
。
- 这是我的
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
- 我有一个基于
> @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
- 插入我的
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
- 而下一次,在
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
- 正如您从
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_product
和 last_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 IN
或 NOT EXISTS
查询,因为在我的例子中,我有来自 Table_Source
和 Table_Destination
的 1000 万行。因为它会让我的数据库工作太辛苦。
你应该使用 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;
我有一个问题,我需要根据 last_update
数据或 last_transaction_product
将选定的行从 table 插入到另一个 table。 last_update
是从 table 更新的数据,而 last_transaction_product
是我商店的最新交易,然后我的行有重复数据但这里有不同的 last_update
列,不能将此重复数据插入到我的目的地 table 此处,因为数据已经插入到目的地 table.
比如我这里有3个table
- 来源Table AS
Table_Source
- 目的地 Table AS
Table_Destination
- 日志Table AS
Table_Log
我的问题是,我的源 Table 和目标 Table 没有任何可用于行 table 标识的 PK
。
- 这是我的
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 |
- 我有一个基于
> @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 |
- 插入我的
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 |
- 而下一次,在
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 |
- 正如您从
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_product
和last_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 IN
或NOT EXISTS
查询,因为在我的例子中,我有来自Table_Source
和Table_Destination
的 1000 万行。因为它会让我的数据库工作太辛苦。
你应该使用 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;