2013-03-01 102 views
1

我擁有包含不同屬性/列的表[Molds],[Machines]和[SpareParts]。我想將它們變成子類型併爲它們創建一個名爲[Assets]的超類型表,以便我可以在維護計劃應用程序中將它們全部引用到一起。爲已經包含數據的子類型表填充外鍵

[Assets]表格將只包含[Asset_ID],[Asset_Type]和[Description]列。 [Asset_ID]是身份PK,[Asset_Type]是一個int(例如Molds = 1,Machines = 2等),[Description]將從子類型表中獲取。我將爲每個子類型表添加一個名爲[Asset_FK]的列作爲外鍵。

我的問題是,每個子類型表都有數百到數千行數據已經在其中。爲每個現有記錄手動創建PK-FK將是不合理的,但我不確定將其自動化所需的SQL。

用於填充(資產)的表,我現在有這樣的:

DECLARE @AssetID TABLE (ID int) 
INSERT INTO Assets (Assets.Description, Assets.Asset_Type) 
OUTPUT Inserted.Asset_ID INTO @AssetID 
SELECT IsNull(Moulds.Description,''), 5 
FROM Moulds 

但是,我不知道如何更新FK在[模具]在同一個查詢,或者如果這是連正確的做法。具體而言,我不知道如何識別我想要更新的所選子類型中的行。

總結我的問題,我有一個空白的超類型表和填充的子類型表。我想使用子類型表填充超類型表,並自動填充現有子類型記錄的FK值以鏈接它們。我如何使用SQL(MS SQL Server 2008r2)來做到這一點?

回答

0

因此,基於RS的答案,我想出了一個主意。我向表[Assets]添加一個臨時列,用於存儲表[Molds](或其他某個子類型表)的PK,將其用於更新操作,然後刪除該列。它看起來像這樣:

USE [Maintenance] 

ALTER TABLE Assets 
ADD Asset_FK int null 

GO 

DECLARE @AssetID TABLE (ID int) 

INSERT INTO Assets (Description, Asset_Type, Asset_FK) 
OUTPUT Inserted.Asset_ID INTO @AssetID 
SELECT IsNull(Description,''), 5, Mould_PK 
FROM Moulds 

UPDATE m 
SET m.Asset_ID = a.Asset_ID 
FROM Moulds m 
INNER JOIN Assets a 
    ON m.Mould_PK = a.Asset_FK AND a.Asset_Type = 5 
INNER JOIN @AssetID a2 ON a.Asset_ID = a2.ID 

GO 

ALTER TABLE Assets 
DROP COLUMN Asset_FK 

可能不是最優雅的答案,但它似乎很簡單,有效。

1

試試這個:

update m 
set m.fkid = a.id 
from moulds m 
inner join assets a 
    on isnull(m.description,'') = a.description and a.Asset_Type = 5 
inner join @AssetID a2 on a.id = a2.id 
+0

感謝您的回答。不幸的是,說明並不總是獨一無二的,所以對我的情況來說並不完全正確。其實,這確實給了我一個想法。 – NeutronFlux 2013-03-01 16:21:54