Pregunta

Tengo una tabla con una columna que quiero extraer y colocar en una tabla separada.

Por ejemplo, digamos que tengo una tabla llamada Contactos.Contactos tiene una columna llamada Nombre que almacena una cadena.Ahora quiero extraer los nombres en otra tabla llamada Nombre y vincular la columna Contact.Name al Id. de la tabla Nombre.

Sólo puedo usar SQL para hacer esto.¿Alguna idea sobre la mejor manera de hacer esto?

Déjame saber si puedo aclarar algo, ¡gracias!

Editar] Un problema es que se pueden vincular diferentes contactos con el mismo nombre.Entonces, cuando diferentes contactos tienen el mismo nombre y se exporta, la tabla Nombre solo tendrá una fila única para ese nombre y todos los contactos apuntarán a esa fila.Supongo que esto no tendría sentido si realmente estuviera trabajando en una libreta de contactos, pero solo la estoy usando para ilustrar mi problema.

¿Fue útil?

Solución

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]

A continuación, añadir restricción de clave externa, etc.

Otros consejos

Cree la nueva tabla con una clave externa que apunte a la tabla de contactos.Luego inserte los nombres y los identificadores de contacto de la tabla de contactos en esta nueva tabla.Después de eso, puede eliminar la columna "nombre" de la tabla de contactos.

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

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

ALTER TABLE Contact
DROP Column name;

EDITAR: Dado que editó la pregunta para mencionar que un nombre se puede asociar con varios contactos, esto cambia las cosas en el sentido opuesto.

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: Asegúrese de crear la clave externa adecuada entre las tablas Contacto y Nombre utilizando el NameId en la tabla Contacto y también cree una restricción ÚNICA en la columna "nombre" en la tabla Nombre.

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;

Esta es una forma de asegurar sólo una fila por cada nombre - se puede sustituir por otras funciones min (como, por ejemplo, como máximo)

.

No estoy muy seguro de por qué usted quiere hacer esto, sin embargo. No importa qué, usted va a terminar con algunos contactos que no tienen un nombre vinculado a ellos ...

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`

El problema es el campo name_id, que es filles con "0" y debe ser tiene el mismo valor que el ID en los contactos de la tabla. Aquí se puede utilizar el LOOP o ITERATE declaración ( si el uso de MySQL).

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top