我有一個問題,我需要根據last_update資料或last_transaction_product從表中插入一個選定的行到另一個表中。last_update是指從表中更新的資料,而last_transaction_product是指我的商店的最新交易,然后我的行有重復的資料,但有一個不同的last_update列在這里,這個重復的資料一定不會被插入到我的目標表中,因為資料已經插入到目標表中。
例如,我這里有3個表。
- 源表作為
Table_Source。
- 目標表
Table_Destination。
- 日志表 AS
Table_Log
我的問題是,我的源表和目的表沒有任何PK,可以用于行表的身份。
我的問題是,我的源表和目的表沒有任何可用于行表身份的PK。
Table_Source| 產品名稱 | 商店名稱最后一次交易的產品最后一次更新。
|---|
| 時鐘 | Benefical
- 我有一個查詢,根據
> @last_transaction_product或> @last_update將其插入到Table_Destination,這里是我從Table_Source插入后的Table_Destination,我在2020-06-02插入它 。
| 產品名稱 | 商店名稱最后一次交易的產品最后一次更新。
|---|
| 時鐘 | Benefical
- 在它插入到我的
Table_Destination之后,它將從最新的活動表中保存記錄到Table_Log,所以這里是我的Table_Log插入之后。
| 表名 | 最后一筆交易_產品 | 最后一次_更新最后一次運行。|
|---|---|---|
| 2020-04-15 | 2020-06-01 | 2020-06-02 |
- 而下一次,在
Table_Source處插入了新的資料。
- 正如你可以從
Table_Source的最新表格中看到,有一個重復的資料('Clock', 'Benefical', '2020-04-15', '2020-06-03'),它有一個不同的last_update。在我的例子中,我想排除這個重復的資料插入到我的Table_Destination中,所以它將只插入('Poster', 'Manioc Shop', '2020-04-27', '2020-06-03')。當然,我使用最新的last_transaction_product和last_update從Table_Log作為我的引數來插入到Table_Destination。所以我的Table_Destination和我的Table_Log將是這樣的。
| 產品名稱 | 商店名稱最后一次交易的產品最后一次更新。
|---|
| 時鐘 | Benefical
| 表名 | 最后一次_交易_產品 | 最后一次_更新最后一次運行。|
|---|---|---|
| 2020-04-15 | 2020-06-01 | 2020-06-02 | 2020-04-27 | 2020-06-03 | 2020-06-04 |
所以現在我的T-SQL是這樣的
BEGIN
-- INSERT DESTINATION DATA --
SET Table_Destination ON;
INSERT INTO
表_目的地
SELECT[/span
*
FROM[/span
表_源
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關閉。
-- 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 IN或NOT EXISTS查詢,因為在我的案例中,我有1000萬行來自Table_Source和Table_Destination。因為這將使我的資料庫作業得太辛苦了。 。
uj5u.com熱心網友回復:
你應該使用NOT EXISTS,這是你最好的選擇,因為有半連接。
如果你有數百萬行的問題,你應該檢查你的索引。
Table_Destination沒有重復的product_name,所以為它建立索引(在兩個表中)是一個好的開始,對它的連接不應該是很可怕的。
另外,在你的WHERE子句中有些奇怪。
我將嘗試這樣做
編輯在NOT EXISTS中添加了一個條件,使產品在每個商店中插入一次而不是只有一次。
當Table_Log為空時,還增加了對第一次運行的保護。
SET Table_Destination ON;
INSERTINTO
表_目的地
SELECT[/span
*
FROM[/span
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'
)攻擊
WHERE
(
last_transaction_product >/span> 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
/* 如果你只需要產品在目的地停留一次,請洗掉下面這行。
如果你想讓產品在每個商店重復一次,則保留這一行 */ /* 移除下面這一行。
and td.shop_name = ts.shop_name
)
SET Table_Destination OFF;
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/314813.html
標籤:
