[英]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
);
您可以按照以下特定順序分兩個步驟進行操作:
使VendorMaster
表與新供應商保持最新。 我假設供應商名稱是您的密鑰(盡管它不應該是名稱,如果您有兩個名稱相同的不同供應商會發生什么?),並且VendorID
是IDENTITY
。
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)
更新(如果存在)並插入(如果不存在)來自每個供應商的數據。 我假設此表上的鍵將是VendorID
和ProductName
(它不應該是產品名稱,它應該是ProductID
或類似的名稱),而DataID
是IDENTITY
。 操作必須按照此特定順序進行,以防止無意義的更新。 如果更新不存在,則更新不會更新;如果已經存在,則插入將不會插入:
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.