2009-06-02 17 views
0

テーブルを取り出して、別のテーブルに配置する列があります。SQL Server:テーブルに列を抽出する

たとえば、連絡先という名前のテーブルがあるとします。連絡先には、文字列を格納するNameという名前の列があります。名前をNameという名前の別のテーブルに引き出し、Contact.NameカラムをNameテーブルのIdにリンクしたいとします。

私はSQLを使ってこれを行うことができます。これについての最善の方法に関するアイデアはありますか?

何かを明確にすることができたら教えてください、ありがとう!

[編集] 1つの問題は、異なる連絡先を同じ名前に結び付けることができることです。したがって、異なる連絡先が同じ名前を持ち、名前がエクスポートされると、名前テーブルにはその名前のための1つの一意の行しかなく、すべての連絡先がその行をポイントします。私は実際にコンタクトブックに取り組んでいれば、これは意味をなさないだろうと思うが、私はそれを使って自分の問題を説明しているだけだ。

+0

多くの人が同じ名前を持っているのと同じ名前が同じ連絡先ではないことに注意してください。名前はほとんど決して1つのフィールドではありません。 「スミスIII、スティーブ」、スティーブ・A・スミスのようなデータが名前と同じ表にある場合、どのようにスティーブ・スミスを効率的にまたは効果的に検索しますか? – HLGEM

+0

本当に私がコンタクトブックを実際に作っていたら、それを考慮する必要があります。しかし、私はイラストレーションとしてそれを使用していました。私が取り組んでいるソリューションは、実際には連絡先とは関係ありません。そうでなければ良い考慮。 – Dave

答えて

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

接触テーブルに戻って指す外部キーを持つ新しいテーブルを作成します。次に、連絡先テーブルの名前とcontactidをこの新しいテーブルに挿入します。その後、連絡先テーブルから「名前」列を削除できます。

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

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

ALTER TABLE Contact 
DROP Column name; 

EDIT:あなたは1名が複数の連絡先に関連付けることができることを言及する質問を編集したので、これは逆の方法で物事を変更します。

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テーブルの上に名前IDを使用して連絡先と名前のテーブル間のappropiate外部キーを作成しても、名前の表に「名前」列にUNIQUE制約を作成することを確認してください。

+0

ダーン、それに私を打つ! –

+0

軽度の可読性の問題で、[名前]の前後にかっこは必要ありません –

+0

Daveはリンクを逆にしたかったと思います。 –

0

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

これは名前ごとに1つだけの行を確保する1つの方法です - あなたは(分他の機能を置き換えることができます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` 

問題は「0」で地下鉄FillesあるNAME_IDフィールド、ありませんし、持っているべきですContacts-Tableのidと同じ値です。ここでは、LOOPまたはITERATEステートメント(MySQLを使用している場合)を使用できます。

関連する問題