2010-07-28 2 views
0

J'essaie de trouver le meilleur Transact-SQL pour transformer des tables non relationnelles en tables plus relationnelles, et prendre en charge les clés étrangères.T-SQL - créer une nouvelle relation de clé étrangère à partir de données non normalisées

Supposons que j'ai une table FRUITS

Id Name  USState 

    1 Apple  Washington 
    2 Pineapple Hawaii 
    3 Orange  Florida 
    4 Peach  Georgia 

etc 

Je veux que les États soient leur propre table avec un identifiant et Nom:

INSERT INTO USSTATE (Name) Select DISTINCT USState from FRUIT 

Maintenant, j'ai tableau USState

Id  Name 

    1  Alabama 
    2  Alaska 

etc. 

Comment puis-je maintenant mettre à jour la valeur USState dans la table FRUIT pour pointer vers l'ID de USSTATE récursivement?

je peux le faire Etat par Etat

DECLARE @USSTATE nvarchar(100) 
Set @USSTATE = 'Alabama' 
Update FRUIT Set USState = (SELECT Id from USSTATE where Name like @USSTATE) 
Set @USSTATE = 'Alaska' -- do this for each State? Arghh!!! 

etc etc

, mais je veux le faire récursive. Merci pour toute aide?

Répondre

4
UPDATE F 
SET F.USState = S.ID 
FROM FRUID AS F 
INNER JOIN USSTATE AS S ON F.USState = S.Name 
0

J'ai voté la réponse ci-dessus à moi pour donner le T-SQL Cependant, vos données par exemple un fruit cravates à un état ... de sorte que vous seriez en train de créer un-à-un. Contrairement à votre question, vos données sont déjà normalisées (sauf s'il y a des fruits dupliqués ou multiples dans la table que vous n'avez pas inclus)

+0

Oui je suis d'accord, je ne cherchais qu'à fournir un exemple simple. Le problème actuel a d'autres aspects plus complexes. Merci! –

0

Vous voulez une nouvelle colonne avec une clé étrangère pour la table USState, est-ce correct ? Commencez par créer la nouvelle colonne de la table FRUIT (appelez-la "USStateId"). Vous devrez rendre la colonne annulable temporairement. Puis créez une relation FK entre USState.Id et Fruit.USStateId.

ensuite écrire une requête pour mettre à jour la nouvelle colonne avec les valeurs correctes:

--(untested but should be close) 
UPDATE f 
SET f.USStateId = s.Id 
FROM Fruit f 
INNER JOIN USState s ON f.USState = s.Name 

Ensuite, faites la nouvelle colonne que vous avez ajouté non annulable.

Enfin, supprimez la colonne USState de la table de fruits.

Questions connexes