填充已包含数据的子类型表的外键

时间:2013-03-01 15:53:24

标签: sql-server-2008 tsql foreign-keys normalization supertype

我有表[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。

为了填充[Assets]表,我目前有这个:

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

但是,我不确定如何在同一个查询中更新[Molds]中的FK,或者这是否是正确的方法。具体来说,我不确定如何识别我想要更新的子类型中的行。

总结一下我的问题,我有一个空白的超类型表和填充的子类型表。我想使用子类型表填充超类型表,并自动填充现有子类型记录的FK值以链接它们。如何使用SQL(MS SQL Server 2008r2)执行此操作?

2 个答案:

答案 0 :(得分: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

答案 1 :(得分: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

可能不是最优雅的答案,但它看似简单而有效。