Question

J'ai une table avec une colonne que je veux extraire et de le mettre dans une table séparée.

Par exemple, permet de dire que j'ai une table nommée Contacts. Contacts a une colonne Nom nommé qui stocke une chaîne. Maintenant, je veux tirer les noms dans une autre table nommée Nom et lier la colonne Contact.Name à l'ID de la table Nom.

Je ne peux utiliser SQL pour le faire. Toutes les idées sur la meilleure façon d'aller à ce sujet?

Permettez-moi de savoir si je peux clarifier quoi que ce soit, merci!

[modifier] Un problème est que les différents contacts peuvent être liés au même nom. Ainsi, lorsque différents contacts ont le même nom et il obtient exporté le tableau de noms aurait seulement une ligne unique pour ce nom et tous les contacts rappelle à cette ligne. Je suppose que cela ne serait pas logique si je travaille actuellement sur un livre de contact, mais je suis juste l'utiliser pour illustrer mon problème.

Était-ce utile?

La solution

CREATE TABLE Name (NameID int IDENTITY(1, 1), [Name] varchar(50))

INSERT INTO Name ([Name])
SELECT DISTINCT [Name]
FROM Contact

ALTER TABLE Contact
    ADD COLUMN NameID int

UPDATE Contact
SET NameID = [Name].NameID
FROM Contact
INNER JOIN [Name]
    ON Contact.[Name] = [Name].[Name]

ALTER TABLE Contact
    DROP COLUMN [Name]

Ensuite, ajoutez la contrainte de clé étrangère, etc.

Autres conseils

Créer la nouvelle table avec une clé étrangère qui pointe à la table de contact. Ensuite, insérez les noms et contactids de la table de contact dans cette nouvelle table. Après cela, vous pouvez supprimer la colonne « nom » de la table de contact.

CREATE TABLE Name
(
   ContactId int,
   Name nvarchar(100)
);

INSERT Name(Name)
SELECT ContactId, Name From Contact;

ALTER TABLE Contact
DROP Column name;

EDIT:. Puisque vous avez modifié la question de mentionner qu'un nom peut être associé à plusieurs contacts, cela change les choses dans le sens inverse

CREATE TABLE Name
(
   NameId int IDENTITY,
   Name nvarchar(100)
);

INSERT Name(Name)
SELECT DISTINCT Name From Contact;

ALTER TABLE Contact
ADD NameId int;

UPDATE c
SET c.NameId = n.NameId
FROM Contact c
JOIN Name n on n.Name = c.Name;

ALTER Table Contact
Drop Column Name;

Remarque: Assurez-vous que vous créez la clé étrangère correspond le entre les tables de contact et nom à l'aide du NameID sur la table de contact et créer une contrainte UNIQUE sur la colonne « nom » dans la table Nom .

insert into another_table( contact_id, name )
select id, name 
from contacts;

insert into new_table (contact_id, name) select min(id), name from contacts group by name;

Ceci est un moyen d'assurer une seule ligne par nom - vous pouvez remplacer d'autres fonctions pour min (comme, par exemple max)

.

Je ne suis pas trop sûr pourquoi vous voulez faire cela, cependant. Peu importe ce que, vous finirez avec des contacts qui ne sont pas un nom lié à eux ...

ALTER TABLE `Contacts` ADD `name_id` INT( 12 ) NOT NULL 
ALTER TABLE `Name` ADD `Name` VARCHAR( 200 ) NOT NULL 
INSERT INTO Name (id, name) SELECT id, Name FROM Contacts
ALTER TABLE `Contacts` DROP `Name`

Le problème est le champ name_id, qui est avec filles « 0 » et devrait être la même valeur que l'identifiant dans le tableau des contacts. Ici, vous pouvez utiliser le déclaration LOOP ou ITERATE ( si vous utilisez MySQL).

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top