Pergunta

Eu tenho uma tabela com uma coluna que eu quero extrair e colocar em uma tabela separada.

Por exemplo, digamos que eu tenho uma tabela chamada de contatos. Contatos tem uma coluna chamada Nome que armazena uma string. Agora eu quero retirar os nomes em outra tabela chamada nome eo link da coluna Contact.Name ao Id da tabela de nomes.

Eu só posso usar SQL para fazer isso. Todas as ideias sobre a melhor maneira de fazer isso?

Deixe-me saber se eu posso esclarecer alguma coisa, obrigado!

[editar] Um problema é que diferentes contatos pode ser amarrado para o mesmo nome. Então, quando diferentes contatos têm o mesmo nome e é exportado a tabela de nomes teria apenas uma linha única para esse nome e todos os contatos apontaria para essa linha. Eu acho que isso não faria sentido se eu estivesse realmente trabalhando em um livro de contato, mas eu só estou usando-o para ilustrar o meu problema.

Foi útil?

Solução

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]

Em seguida, adicione restrição de chave estrangeira, etc.

Outras dicas

Criar a nova tabela com uma chave estrangeira que aponta de volta para a mesa de contato. Em seguida, insira os nomes e contactids da tabela de contato para esta nova tabela. Depois que você pode descartar a coluna "nome" da tabela de contato.

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

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

ALTER TABLE Contact
DROP Column name;

EDIT:. Desde que você tenha editado a questão de mencionar que um nome pode ser associado a vários contatos, isso muda as coisas no caminho oposto

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: Certifique-se de criar a chave estrangeira apropriado entre o contato e nome tabelas usando o NameID na mesa de Contato e também criar uma restrição UNIQUE na coluna "nome" na tabela Nome do .

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 é uma forma de garantir apenas uma linha por nome -. Você pode substituir outras funções para min (como, por exemplo max)

Eu não estou muito certo por que você iria querer fazer isso, no entanto. Não importa o quê, você vai acabar com alguns contatos que não têm um nome ligado a eles ...

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`

O problema é o campo name_id, que é filles com "0" e deve ser ter o mesmo valor que o id no Contactos-Table. Aqui você pode usar o href="http://dev.mysql.com/doc/refman/5.0/en/loop-statement.html" rel="nofollow noreferrer"> LOOP ou ITERATE declaração

scroll top