我有表[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)执行此操作?
答案 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
可能不是最优雅的答案,但它看似简单而有效。