SQL Server: извлечение столбца в таблицу - PullRequest
0 голосов
/ 03 июня 2009

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

Например, допустим, у меня есть таблица с именем Contacts. У контактов есть столбец с именем Name, в котором хранится строка. Теперь я хочу вытащить имена в другую таблицу с именем Name и связать столбец Contact.Name с Id таблицы Name.

Я могу использовать только SQL для этого. Какие-нибудь идеи о том, как это сделать?

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

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

Ответы [ 5 ]

5 голосов
/ 03 июня 2009
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]

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

4 голосов
/ 03 июня 2009

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

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;

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

0 голосов
/ 03 июня 2009
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» и должно иметь то же значение, что и идентификатор в таблице контактов. Здесь вы можете использовать оператор LOOP или ITERATE (если вы используете MySQL).

0 голосов
/ 03 июня 2009

insert into new_table (contact_id, name) select min(id), name from contacts group by name;

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

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

0 голосов
/ 03 июня 2009
insert into another_table( contact_id, name )
select id, name 
from contacts;
...