1

我有表 [Moulds]、[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

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

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

4

2 回答 2

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
于 2013-03-01T16:00:31.343 回答
0

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

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

可能不是最优雅的答案,但它看起来很简单并且有效。

于 2013-03-01T16:29:49.227 回答