1

J'ai des tables [Moules], [Machines] et [Pièces détachées] chacune avec différents attributs/colonnes. Je voudrais les transformer en sous-types et créer pour eux une table supertype appelée [Assets] afin que je puisse les référencer tous ensemble dans une application de planification de maintenance.Remplir des clés étrangères pour une table de sous-types contenant déjà des données

La table [Assets] contiendra simplement les colonnes [Asset_ID], [Asset_Type] et [Description]. [Asset_ID] est une identité PK, [Asset_Type] est un int (par exemple, Molds = 1, Machines = 2, etc.) et [Description] sera extrait des tables de sous-types. Je vais ajouter une colonne appelée [Asset_FK] à chacune des tables de sous-types en tant que clé étrangère.

Mon problème est que chaque table de sous-type contient déjà des centaines à des milliers de lignes de données. Il serait déraisonnable de créer manuellement PK-FK pour chaque enregistrement existant, mais je ne suis pas sûr du SQL requis pour l'automatiser.

Pour peuplant les [actifs] table, j'ai actuellement ceci:

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 

Mais, je ne suis pas sûr de savoir comment mettre à jour le FK dans [Moisissures] dans la même requête, ou si cela est encore la bonne approche. Plus précisément, je ne suis pas sûr de savoir comment identifier la ligne dans les sous-types que j'ai sélectionnés que je veux mettre à jour.

Pour résumer ma question, j'ai une table vide de type supertype et des tables de sous-types remplies. Je veux remplir la table supertype en utilisant les tables de sous-types et remplir automatiquement les valeurs FK pour les enregistrements de sous-type existants pour les lier. Comment puis-je faire cela en utilisant SQL (MS SQL Server 2008r2)?

Répondre

0

Ainsi, en fonction de la réponse rs, je suis venu avec une idée. J'ajoute une colonne temporaire à la table [Assets] qui stocke le PK de la table [Molds] (ou d'une autre table de sous-types), l'utilise pour les opérations de mise à jour, puis dépose la colonne. Il ressemble à ceci:

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 

Probablement pas la réponse la plus élégante, mais il semble simple et fonctionne.

1

Essayez ceci:.

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 
+0

Merci pour la réponse. Malheureusement, la description n'est pas toujours unique, ce qui ne fonctionne pas vraiment pour mon cas. En fait, cela me donne une idée cependant. – NeutronFlux

Questions connexes