SQL-сервер:Извлечение столбца в таблицу
-
09-09-2019 - |
Вопрос
У меня есть таблица со столбцом, который я хочу извлечь и поместить в отдельную таблицу.
Например, предположим, что у меня есть таблица с именем «Контакты».В Контактах есть столбец с именем Имя, в котором хранится строка.Теперь я хочу перенести имена в другую таблицу с именем 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).