2009-06-02 194 views
0

我有一張表,其中包含要提取出來的列並放入單獨的表中。SQL Server:將列提取到表中

例如,假設我有一個名爲Contacts的表。聯繫人有一個名爲Name的列,它存儲一個字符串。現在我想將名稱拉出到名爲Name的另一個表中,並將Contact.Name列鏈接到Name表的Id。

我只能用SQL來做到這一點。任何關於最佳途徑的想法?

讓我知道,如果我能澄清任何事情,謝謝!

一個問題是,不同的聯繫人可以綁定到相同的名稱。因此,當不同的聯繫人具有相同的名稱並且被導出時,名稱表將只有該名稱的唯一行,並且所有聯繫人都將指向該行。我想如果我實際上在處理聯繫簿,這是沒有意義的,但我只是用它來說明我的問題。

+0

請記住,相同的名稱是不一樣的聯繫人,因爲許多人有相同的名稱。名字幾乎不應該是一個字段。當你有與名字相同的表格中的「史密斯三,史蒂夫」和史蒂夫史密斯等數據時,你如何有效或有效地搜索史密斯史密斯的所有內容? – HLGEM 2009-06-03 18:26:50

+0

對,如果我真的在聯繫簿上工作,我不得不考慮這一點。但是,我只是用它作爲例證。我正在處理的解決方案實際上與聯繫人無關。好的考慮,否則。 – Dave 2009-06-04 20:18:30

回答

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] 

然後添加外鍵約束等

0
insert into another_table(contact_id, name) 
select id, name 
from contacts; 
4

使用指向聯繫人表的外鍵創建新表。然後將聯繫人表中的名稱和聯繫人插入到此新表中。之後,您可以從聯繫人表中刪除「姓名」列。

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建立聯繫和名稱表之間此時,相應的外鍵,並在名稱表中的「名稱」列上創建一個唯一約束。

0

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

這是確保每名只有一行一條路 - 你可以代替其他功能分鐘(像例如max)。

雖然我不太確定你爲什麼想要這樣做。不管你到底是什麼,與一些接觸沒有鏈接到他們的名字......

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` 

的問題是名_ID字段,它是FILLES用「0」,應該有與Contacts-Table中的id相同的值。在這裏您可以使用LOOP或ITERATE語句(如果使用MySQL)。