簡體   English   中英

使用來自另一個表的外鍵將數據插入或更新到表中

[英]Insert or Update Data into Table with Foreign Key from Another Table

有兩張桌子

Table VendorMaster
|VendorID|Vendor|
|    1   |Vendor1|
|    2   |Vendor2|

Table Data
|DataID|VendorID|ProductName|Quantity|
|   1  |    1   |  Product1 |   100  |
|   2  |    1   |  Product2 |   200  |
|   3  |    2   |  Product1 |   400  |
|   4  |    2   |  Product2 |   100  |

一個供應商可以有多個使用外鍵引用的產品現在,我還有另一個用於暫存數據的表

Table Staging
|StagingID|Vendor|ProductName|Quantity|

我需要將數據從暫存表插入或更新到數據表和供應商表中。 像登台表一樣,可用於僅更新數量或添加新的供應商和/或產品。

我該如何進行呢? 我正在使用SQL Server。

我嘗試使用此方法 ,但是它無法更新/插入外鍵主表。

您需要編寫以下代碼來插入和更新相應的表,並且我假設VendorID和DataID列是標識列。

insert into VendorMaster (Vendor)
select Vendor
from Staging s
where not exists (
select 1 from  VendorMaster v 
where v.vendor = s.vendor
);


Update d
set Quantitty = s.Quantity
from Data d
inner join venderMaster v on d.vendorid = v.vendorid
inner join staging s on s.vendor = v.vendor 
and s.productName = d.productname
and d.Quantity <> s.Quantity;

insert into Data (VendorID,ProductName,Quantity)
select VendorID,ProductName,Quatity
from Vendor v
inner join staging s on s.Vendor = v.Vendor 
where not exists
(
 select 1 from Data d 
where d.vendorid = v.vendorid
and s.productName = d.productname
);

您可以按照以下特定順序分兩個步驟進行操作:

  1. 使VendorMaster表與新供應商保持最新。 我假設供應商名稱是您的密鑰(盡管它不應該是名稱,如果您有兩個名稱相同的不同供應商會發生什么?),並且VendorIDIDENTITY

     INSERT INTO VendorMaster ( Vendor) SELECT DISTINCT S.Vendor FROM Staging AS S WHERE NOT EXISTS (SELECT 'vendor not yet loaded' FROM VendorMaster AS V WHERE V.Vendor = S.Vendor) 
  2. 更新(如果存在)並插入(如果不存在)來自每個供應商的數據。 我假設此表上的鍵將是VendorIDProductName (它不應該是產品名稱,它應該是ProductID或類似的名稱),而DataIDIDENTITY 操作必須按照此特定順序進行,以防止無意義的更新。 如果更新不存在,則更新不會更新;如果已經存在,則插入將不會插入:

     UPDATE D SET Quantity = S.Quantity FROM Staging AS S INNER JOIN VendorMaster AS V ON S.Vendor = V.Vendor -- Fetch the VendorID from VendorMaster INNER JOIN Data AS D ON V.VendorID = D.VendorID AND S.ProductName = D.ProductName WHERE S.Quantity <> D.Quantity -- Update only if there are differences INSERT INTO Data ( VendorID, ProductName, Quantity) SELECT VendorID = V.VendorID, ProductName = S.ProductName, Quantity = S.Quantity FROM Staging AS S INNER JOIN VendorMaster AS V ON S.Vendor = V.Vendor -- Fetch the VendorID from VendorMaster WHERE NOT EXISTS ( SELECT 'data not yet loaded' FROM Data AS D WHERE V.VendorID = D.VendorID AND S.ProductName = D.ProductName) 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM