SQLサーバー:列をテーブルに抽出する
-
09-09-2019 - |
質問
列を抽出して別のテーブルに配置したいテーブルがあります。
たとえば、Contacts という名前のテーブルがあるとします。Contacts には、文字列を格納する Name という名前の列があります。ここで、名前を Name という名前の別のテーブルに抽出し、Contact.Name 列を Name テーブルの ID にリンクしたいと思います。
これを行うには SQL を使用するしかありません。これについて最善の方法について何かアイデアはありますか?
何か明確にできることがあれば教えてください、ありがとう!
編集] 1つの問題は、異なる連絡先を同じ名前に結び付けることができることです。したがって、異なる連絡先が同じ名前を持ち、それがエクスポートされると、名前テーブルにはその名前の一意の行が 1 つだけ含まれ、すべての連絡先がその行を指すことになります。実際に連絡帳を作成している場合、これは意味がないと思いますが、問題を説明するためにこれを使用しているだけです。
解決
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]
するとなど、外部キー制約を追加します。
他のヒント
連絡先テーブルを指す外部キーを使用して新しいテーブルを作成します。次に、連絡先テーブルの名前と連絡先 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 制約を作成していることを確認してください。
insert into another_table( contact_id, name )
select id, name
from contacts;
insert into new_table (contact_id, name)
select min(id), name
from contacts
group by name;
このは名前ごとに1つだけの行を確保することの一つの方法です - あなたが(例えば最大のため、など)分間他の機能を置き換えることができます。
。私はあなたがが、これを実行したいと思う理由は、あまりにもわかりません。どんなにあなたがそれらにリンクされている名前を持っていないいくつかの接点で終わるなるか、...
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あり、コンタクト、表IDと同じ値を有していなければならないNAME_IDフィールドです。ここでは、( LOOPするまたはITERATEステートメントを使用することができますあなたは)MySQLを使用している場合。