Sql server 2008 为已包含数据的子类型表填充外键
我有表[模具]、[机器]和[备件],每个表都有不同的属性/列。我想将它们划分为子类型,并为它们创建一个名为[Assets]的超类型表,这样我就可以在维护计划应用程序中同时引用它们 [Assets]表只包含[Asset_ID]、[Asset_Type]和[Description]列。[Asset_ID]是一个标识主键,[Asset_Type]是一个int(例如模具=1,机器=2等),并且[Description]将从子类型表中获取。我将在每个子类型表中添加一个名为[Asset_FK]的列作为外键 我的问题是,每个子类型表中已有数百到数千行数据。为每个现有记录手动创建PK-FK是不合理的,但我不确定自动化它所需的SQL 为了填充[Assets]表,我目前有: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]的列作为外键
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
也许这不是最优雅的答案,但它看起来很简单而且有效。谢谢你的回答。不幸的是,描述并不总是唯一的,所以这对我的案例来说不太合适。事实上,这确实给了我一个想法。谢谢你的回答。不幸的是,描述并不总是唯一的,所以这对我的案例来说不太合适。事实上,这确实给了我一个想法。