0

我有一个表,其中有一列我想提取出来并放入一个单独的表中。

例如,假设我有一个名为 Contacts 的表。Contacts 有一个名为 Name 的列,其中存储了一个字符串。现在我想将名称提取到另一个名为 Name 的表中,并将 Contact.Name 列链接到 Name 表的 Id。

我只能使用 SQL 来执行此操作。关于解决此问题的最佳方法的任何想法?

如果我能澄清任何事情,请告诉我,谢谢!

[编辑] 一个问题是不同的联系人可以绑定到同一个名字。因此,当不同的联系人具有相同的名称并且它被导出时,名称表将只有该名称的一个唯一行,并且所有联系人都将指向该行。我想如果我实际上是在编写通讯录,这将没有意义,但我只是用它来说明我的问题。

4

5 回答 5

5
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]

然后添加外键约束等。

于 2009-06-02T21:51:28.767 回答
4

使用指向联系人表的外键创建新表。然后将联系人表中的姓名和联系人 ID 插入到这个新表中。之后,您可以从联系人表中删除“名称”列。

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 表上的 NameId 在 Contact 和 Name 表之间创建适当的外键,并在 Name 表的“name”列上创建 UNIQUE 约束。

于 2009-06-02T21:50:01.687 回答
0
insert into another_table( contact_id, name )
select id, name 
from contacts;
于 2009-06-02T21:47:20.197 回答
0

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

这是确保每个名称只有一行的一种方法 - 您可以用其他函数替换 min(例如 max)。

不过,我不太确定您为什么要这样做。无论如何,你最终会得到一些没有名字链接的联系人......

于 2009-06-02T22:02:24.313 回答
0
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”填充,并且应该与联系人表中的 id 具有相同的值。在这里您可以使用LOOP或 ITERATE 语句(如果您使用 MySQL)。

于 2009-06-02T22:08:30.807 回答