Domanda

Ho una tabella con una colonna che voglio estrarre fuori e messo in una tabella separata.

Per esempio, Diciamo che ho una tabella denominata Contatti. Contatti prevede una colonna denominata Nome che memorizza una stringa. Ora voglio tirare fuori i nomi in un'altra tabella denominata Nome e collegare la colonna Contact.Name per l'id della tabella dei nomi.

posso solo usare SQL per fare questo. Tutte le idee sul modo migliore per andare su questo?

Fatemi sapere se posso chiarire nulla, grazie!

[modifica] Un problema è che diversi contatti possono essere legati allo stesso nome. Così, quando diversi contatti hanno lo stesso nome e si arriva esportati tabella Nome avrebbe solo una riga unica per quel nome e tutti i contatti sarebbe puntare a quella riga. Credo che questo non avrebbe senso se fossi davvero lavorando a un libro di contatto, ma sto solo usando per illustrare il mio problema.

È stato utile?

Soluzione

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]

Quindi aggiungere vincolo di chiave esterna, ecc.

Altri suggerimenti

Creare la nuova tabella con una chiave esterna che punta di nuovo al tavolo di contatto. Quindi inserire i nomi e contactids dalla tabella di contatto in questa nuova tabella. Dopo di che si può eliminare la colonna "nome" dal tavolo di contatto.

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

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

ALTER TABLE Contact
DROP Column name;

EDIT:. Dal momento che è stato modificato il problema di dire che un nome può essere associato a più contatti, questo cambia le cose in modo opposto

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;

Nota: Assicurati di creare la chiave esterna appropriata tra il contatto e il nome le tabelle utilizzando il NameID sul tavolo di contatto e anche creare un vincolo UNIQUE sulla colonna "nome" della tabella Nome .

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;

Questo è un modo per garantire una sola riga per nome - è possibile sostituire altre funzioni per min (come, per esempio max)

.

Io non sono troppo sicuro perché si vuole fare questo, però. Non importa cosa, si finirà con alcuni contatti che non hanno un nome legato a loro ...

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`

Il problema è il campo name_id, che è filles con "0" e dovrebbe essere hanno lo stesso valore come ID nella Contacts-Table. Qui è possibile utilizzare il LOOP o ITERATE economico ( se si utilizza MySQL).

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top