2012-01-21 18 views
0

我一直在尋找,我還沒有找到一個使用合併填充相關表的示例。如何使用SQL合併填充主詳細信息相關表

The Northwind DB Order & OrderDetail表可以被使用。 (在我們的場景中,我們的表格有3個深度。)

爲了簡單起見,假設我們有以下表格。

訂單

OrderID PK 
OrderNumber 

訂單明細

OrderID - PK 
OrderLineItemNumber PK - FK to Orders.OrderID field 

OrderDetailDetails

OrderID - PK - FK to OrderDetails.OrderID 
OrderLineItemNumber - PK - FK to OrderDetails.OrderLineItemNumber 
OrderSequenceNumber - PK 

另外,在第是場景,記錄被寫入與上述表格相同的登臺表中。合併需要將3個登臺表中的記錄合併到3個匹配的生產表中。

製作Order表的OrderId將不會共享OrderOrderId表的值。

因此,如果合併條件都滿足,那麼就必須有一個插入到Order表來生成OrderId(集身份),因爲需要對將要創建的OrderDetail & OrderDetailDetailsOrderId

現在我已經用C#編寫了一個服務,可以完成所有這些工作,但這不是高性能的。

MERGE被發現,所以我們正在研究它是否可以用於這種情況。任何提示或指針將不勝感激。

謝謝。

編輯:我現在使用輸出存儲值到一個名爲@MergeOutput的臨時表中。

Declare @MergeOutput Table 
(
     ActionType varchar(10), 
     InsertedOrderId int, 
     StagingOrderID int, 
     DeletedOrderId int 
); 

However, I need to do a Merge on all 3 tables. (Order, OrderDetail & OrderDetailDetails) 

Also, these tables have more fields than just the Id's. 

So I've started creating the 2nd Merge for the OrderDetail table. 

MERGE OrderDetail AS OD 
USING(
    SELECT OrderID, 
      OrderLineItemNumber, 
     ProductId 
    FROM OrderDetail AS OD 
    where OrderId IN (Select StagingOrderID from @MergeOutput where ActionType = 'INSERT' 
) AS src(OrderID, 
     OrderLineItemNumber, 
     ProductId 
) 
ON (OD.OrderId = src.Order AND OD.OrderLineItemNumber = src.OrderLineItemNumber) 
WHEN NOT MATCHED By Target THEN 

INSERT INTO <-- (This doesn't work no matter what I've tried so far.) 
    Select (Select Distinct InsertedOrderID from @MergeOutput where StagingOrderId = OrderID), src.OrderLineItemNumber, src.ProductId 
; 

我在上面的代碼中看到以下錯誤。 「關鍵字‘到’

我需要合併的功能,以移動在所有3個表

看起來我終於得到了這工作記錄附近的語法不正確,我不得不改變Insert語句到如下。

Insert(OrderId, OrderLineItemId, ProductID) 
Values((Select Distinct InsertedOrderID from @MergeOutput where StagingOrderId = OrderID), src.OrderLineItemNumber, src.ProductId) 

我試過這個Insert語句早些時候,我只是想通了,我只好換行選擇括號()。

感謝大家的幫助。我希望我可以隨身攜帶這對我來說第三張桌子。

+0

** **什麼數據庫和哪個版本? ** SQL **只是結構化查詢語言(Structured Query Language) - 許多數據庫系統使用的語言 - SQL是** NOT **數據庫產品......類似這樣的東西通常是供應商特定的 - 所以我們真的需要知道什麼你正在使用的數據庫系統.... –

+0

你似乎誤解了'OUTPUT ... INTO'的概念。請看看這個問題:[使用merge..output獲取source.id和target.id之間的映射](http://stackoverflow.com/questions/5365629/using-merge-output-to-get-mapping -between-source-id-and-target-id),據我所知,它基本上就是你想要做的事情。以防萬一,您可能還需要手頭有['MERGE'手冊](http://msdn.microsoft.com/zh-cn/library/bb510625.aspx「MERGE(Transact-SQL)」)。 –

+0

剛剛看到你的插入問題。這是一個句法問題。讓我們知道它是否適用於第三張桌子。如果不是,我會幫你的。 – usr

回答

0

這是一個令人討厭的問題,不斷出現。您需要提取插入的標識值。在SQL Server中,可以使用帶有INSERT「虛擬表」的OUTPUT子句(http://msdn.microsoft.com/en-us/library/ms177564.aspx)執行此操作。這使您可以在一個語句中獲得所有插入的ID。

然後你可以推的ID到一個臨時表,並使用它們像這樣適當的主標識插入詳細記錄:

INSERT INTO Detail 
SELECT * from Staging_Detail 
JOIN #MasterIDs on Staging_Detail.MasterID = #MasterIDs.MasterID 
+0

MS SQL 2008 R2。自從我發佈後,我已經想出瞭如何使用Output來將Staging_Order表合併到Order時填充臨時表。請記住,每個表格都有更多的字段。我只是想保持這個簡單。所以現在我創建了Order記錄和Staging記錄OrderId,我可以將其映射到新的OrderId。所以我爲OrderDetail記錄啓動另一個合併表。我現在的問題是我需要合併使用字段和新的OrderID。 (我很抱歉,但這個網站不會讓我擊中新段落。)合併似乎不允許進入。 – kfrosty

+0

@FrostKris:從usr鏈接的doc頁面可以看出,MERGE'確實允許'INTO'(即如果你的意思是'OUTPUT ... INTO')。此外,在所有允許使用'OUTPUT'子句的命令中,'MERGE'是唯一一個不僅允許引用'INSERTED'或'DELETED'列,而且還引用源表列的命令。你試過了嗎? –

+0

@FrostKris:糟糕,我之前評論中的第二條語句不是很準確,對不起:'UPDATE'和'DELETE'也允許引用源文件。不過,主要的一點是,你可以用'MERGE'做到這一點,這與你的問題有關。 –