0

抽出して別のテーブルに配置したい列を持つテーブルがあります。

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

これを行うにはSQLしか使用できません。これについて行くための最良の方法に関するアイデアはありますか?

何か明確にできるかどうか教えてください、ありがとう!

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

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;

編集: 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テーブルのNameIdを使用して、ContactテーブルとNameテーブルの間に適切な外部キーを作成し、Nameテーブルの「name」列にUNIQUE制約を作成するようにしてください。

于 2009-06-02T21:50:01.687 に答える
0

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

これは、名前ごとに1つの行のみを確保する1つの方法です。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」で埋められており、Contacts-Tableのidと同じ値である必要があります。ここでは、LOOPまたはITERATEステートメントを使用できます(MySQLを使用している場合)。

于 2009-06-02T22:08:30.807 に答える
0
insert into another_table( contact_id, name )
select id, name 
from contacts;
于 2009-06-02T21:47:20.197 に答える