1

テーブル[Moulds]、[Machines]、[SpareParts]があり、それぞれ属性/列が異なります。それらをサブタイプにして、[Assets]というスーパータイプのテーブルを作成し、メンテナンススケジューリングアプリケーションでそれらすべてを一緒に参照できるようにしたいと思います。

[Assets]テーブルには、[Asset_ID]、[Asset_Type]、[Description]の列が含まれます。[Asset_ID]はIDPK、[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 に答える