Вопрос

У меня есть таблица со столбцом, который я хочу извлечь и поместить в отдельную таблицу.

Например, предположим, что у меня есть таблица с именем «Контакты».В Контактах есть столбец с именем Имя, в котором хранится строка.Теперь я хочу перенести имена в другую таблицу с именем Name и связать столбец Contact.Name с идентификатором таблицы Name.

Для этого я могу использовать только SQL.Есть идеи, как лучше всего это сделать?

Дайте мне знать, если я смогу что-то прояснить, спасибо!

Редактировать] Одна проблема заключается в том, что разные контакты могут быть связаны с тем же именем.Поэтому, когда разные контакты имеют одно и то же имя и оно экспортируется, в таблице имен будет только одна уникальная строка для этого имени, и все контакты будут указывать на эту строку.Думаю, это не имело бы смысла, если бы я на самом деле работал над книгой контактов, но я просто использую ее, чтобы проиллюстрировать свою проблему.

Это было полезно?

Решение

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]

Затем добавьте ограничение внешнего ключа и т. д.

Другие советы

Создайте новую таблицу с внешним ключом, указывающим на таблицу контактов.Затем вставьте имена и контакты из таблицы контактов в эту новую таблицу.После этого вы можете удалить столбец «имя» из таблицы контактов.

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

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

ALTER TABLE Contact
DROP Column name;

РЕДАКТИРОВАТЬ: Поскольку вы отредактировали вопрос, упомянув, что одно имя может быть связано с несколькими контактами, это меняет ситуацию противоположным образом.

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;

ПРИМЕЧАНИЕ: Убедитесь, что вы создали соответствующий внешний ключ между таблицами «Контакт» и «Имя», используя NameId в таблице «Контакт», а также создали ограничение UNIQUE для столбца «имя» в таблице «Имя».

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;

Это один из способов обеспечить наличие только одной строки для каждого имени — вы можете заменить min другими функциями (например, max).

Хотя я не совсем понимаю, зачем вам это делать.Несмотря ни на что, в конечном итоге у вас останутся контакты, к которым не привязано имя...

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`

Проблема заключается в поле name_id, которое заполняется значением «0» и должно иметь то же значение, что и идентификатор в таблице контактов.Здесь вы можете использовать ПЕТЛЯ или оператор ITERATE (если вы используете MySQL).

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top