Sql server 2008 为已包含数据的子类型表填充外键

Sql server 2008 为已包含数据的子类型表填充外键,sql-server-2008,tsql,foreign-keys,normalization,supertype,Sql Server 2008,Tsql,Foreign Keys,Normalization,Supertype,我有表[模具]、[机器]和[备件],每个表都有不同的属性/列。我想将它们划分为子类型,并为它们创建一个名为[Assets]的超类型表,这样我就可以在维护计划应用程序中同时引用它们 [Assets]表只包含[Asset_ID]、[Asset_Type]和[Description]列。[Asset_ID]是一个标识主键,[Asset_Type]是一个int(例如模具=1,机器=2等),并且[Description]将从子类型表中获取。我将在每个子类型表中添加一个名为[Asset_FK]的列作为外键

我有表[模具]、[机器]和[备件],每个表都有不同的属性/列。我想将它们划分为子类型,并为它们创建一个名为[Assets]的超类型表,这样我就可以在维护计划应用程序中同时引用它们

[Assets]表只包含[Asset_ID]、[Asset_Type]和[Description]列。[Asset_ID]是一个标识主键,[Asset_Type]是一个int(例如模具=1,机器=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
但是,我不确定如何在同一个查询中更新[Moves]中的FK,或者这是否是正确的方法。具体来说,我不确定如何在我选择的要更新的子类型中标识行

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

尝试以下方法:

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
试试这个:

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

所以,根据rs.的回答,我想出了一个主意。我向表[Assets]添加一个临时列,该列存储表[Molds](或其他一些子类型表)的主键,将其用于更新操作,然后删除该列。看起来是这样的:

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

也许不是最优雅的答案,但它看起来很简单而且有效。

因此,根据rs.的答案,我想出了一个主意。我向表[Assets]添加一个临时列,该列存储表[Molds](或其他一些子类型表)的主键,将其用于更新操作,然后删除该列。看起来是这样的:

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

也许这不是最优雅的答案,但它看起来很简单而且有效。

谢谢你的回答。不幸的是,描述并不总是唯一的,所以这对我的案例来说不太合适。事实上,这确实给了我一个想法。谢谢你的回答。不幸的是,描述并不总是唯一的,所以这对我的案例来说不太合适。事实上,这确实给了我一个想法。