1

インポートしているデータの自然キーをある種の代理キーに変換する方法を見つけようとしています。

例:

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、特別割引を適用するものとしてカウントされるため、同じベンダーが同じ日にどの注文を行ったかを追跡したいと思います。

データベースを構造化して、どの注文が一括注文であるかを追跡し、の自然キーをある種の代理キーに効果的に変換して、VendorそれSaleDateを検索できるようにする方法はOrderFact.Idありますか?

4

1 に答える 1

0

RelatedOrder最終的に、主キーとして代理キーを使用し、列として自然キーを使用してテーブルを作成しました。次に、 byをFactテーブルRelatedOrderMappingにマッピングするためのテーブルを作成しました。例(T-SQL for SQL Server 2008 R2):RelatedOrderOrderId

--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
于 2013-02-13T13:32:40.983 に答える