1

我試圖找到一種方法來對一些數據,我導入到某種代理鍵變換自然鍵。Sql Server的改造自然鍵進入代理鍵

例子:

說我有一個表稱爲OrderFact持有的所有關於我的訂單信息:

CREATE TABLE OrderFact 
(
    Id INT IDENTITY PRIMARY KEY 
    ,OrderId INT NOT NULL 
    ,Amount INT NOT NULL 
    ,Cost MONEY NOT NULL 
    ,SaleDate DATE NOT NULL 
); 
GO  

INSERT INTO OrderFact (OrderId, Amount, Cost, SaleDate) 
VALUES (1, 2, 12.00, '1/1/2012'), (3, 1, 6.00, '12/29/2011'), (4, 5, 1.00, '1/1/2012'); 

現在我得到的所有從POS系統,我的訂單數據從一些廠商,所以我臨時表是這樣的:

CREATE TABLE OrderStaging 
(
    OrderId INT 
    ,Vendor INT 
    ,Amount INT 
    ,Cost MONEY 
    ,SaleDate DATE 
); 
GO 

INSERT INTO OrderStaging (OrderId, Vendor, Amount, Cost, SaleDate) 
VALUES (1, 1, 2, 12.00, '1/1/2012'), (3, 2, 1, 6.00, '12/29/2011'), (4, 1, 5, 1.00, '1/1/2012'); 

現在我不關心誰是放置訂單,但我想跟蹤哪些訂單在同一天由同一個供應商處理,因爲它們被算作爲我申請特別折扣的Bulk Order

有沒有一種辦法可以構建數據庫,所以我可以跟蹤哪些訂單批量訂單有效轉化的VendorSaleDate自然鍵變成某種代理鍵,這樣我就可以查找OrderFact.Id反對呢?

+2

如何將VendorId添加到OrderFact表中? – Asdfg 2013-02-08 19:04:37

+0

@Asdfg了'VendorId'是不是在告訴真的可靠哪些訂單屬於哪一家廠商的,所以我想這可能是更容易只是組訂單防止出現不一致。 – Romoku 2013-02-08 19:07:13

+0

您可能想要創建一個新表來映射供應商ID並使用它。 – Asdfg 2013-02-08 19:09:23

回答

0

我結束了一個代理鍵作爲主鍵和自然鍵作爲其列創建RelatedOrder表。然後我創建了一個RelatedOrderMapping表用於通過OrderId映射RelatedOrder到事實數據表。示例(SQL Server 2008 R2的T-SQL):

--Create our RelatedOrder table which contains the Natural Key as its columns 
CREATE TABLE RelatedOrder 
(
    Id INT IDENTITY PRIMARY KEY 
    ,VendorId INT NOT NULL 
); 
GO 

--Create our mapping table for linking OrderFact to RelatedOrder 
CREATE TABLE RelatedOrderMapping 
(
    Id INT IDENTITY PRIMARY KEY 
    ,RelatedOrderId INT NOT NULL REFERENCES RelatedOrder (Id) 
    ,OrderFactId INT NOT NULL REFERENCES OrderFact (Id) 
    ,OrderId INT NOT NULL 
); 
GO 

--Insert one instance of each VendorId 
INSERT INTO RelatedOrder (VendorId) 
SELECT DISTINCT VendorId FROM OrderStaging; 
GO 

--Create a temp table to hold our output clause 
CREATE TABLE #RelatedOrder 
(
    Id INT IDENTITY PRIMARY KEY 
    ,RelatedOrderId INT NOT NULL REFERENCES RelatedOrder (Id) 
    ,OrderFactId INT NOT NULL REFERENCES OrderFact (Id) 
    ,OrderId INT NOT NULL 
); 
GO 

--Create our precomputed table to speed up the MERGE 
CREATE TABLE #OrderStaging 
(
    OrderId INT NOT NULL 
    ,Amount INT NOT NULL 
    ,Cost MONEY NOT NULL 
    ,SaleDate DATE NOT NULL 
    ,RelatedOrderId INT NOT NULL 
); 
GO 

--Precompute our MERGE statement 
INSERT INTO #OrderStaging(OrderId, Amount, Cost, SaleDate, RelatedOrderId) 
SELECT OrderId, Amount, Cost, SaleDate, RelatedOrderId 
FROM OrderStaging os 
JOIN RelatedOrder ro 
ON ro.VendorId = os.VendorId 

--Insert our data into the fact table and output the result into our #RelatedOrder 
MERGE OrderFact AS [Target] 
USING #OrderStaging AS [Source] 
ON 1 = 0 
WHEN NOT MATCHED BY TARGET THEN 
    INSERT(OrderId, Amount, Cost, SaleDate) 
    VALUES([Source].OrderId, [Source].Amount, [Source].Cost, [Source].SaleDate) 
    OUTPUT Inserted.Id, [Source].OrderId, [Source].RelatedOrderId 
    INTO #RelatedOrder(OrderFactId, OrderId, RelatedOrderId) 
; 

--Insert our mappings 
INSERT INTO RelatedOrderMapping(RelatedOrderId, OrderFactId, OrderId) 
SELECT RelatedOrderId, OrderFactId, OrderId FROM #RelatedOrder; 
GO 

--Done