Frage

Ich habe eine Tabelle mit einer Spalte, die ich zu extrahieren und einen separaten Tisch in.

Zum Beispiel können sagen, dass ich eine Tabelle namens Kontakte haben. Kontakte hat eine Spalte mit dem Namen Name, der eine Zeichenfolge speichert. Jetzt möchte ich die Namen in einer anderen Tabelle mit dem Namen Namen ziehen und verbinden die Contact.Name Spalte auf die Id des Name-Tabelle.

Ich kann nur SQL verwenden, um dies zu tun. Irgendwelche Ideen auf dem besten Weg zu gehen über diese?

Lassen Sie mich wissen, ob ich etwas klarstellen kann, Dank!

[Bearbeiten] Ein Problem besteht darin, dass verschiedene Kontakte können mit dem gleichen Namen gebunden werden. Also, wenn verschiedene Kontakte die gleichen Namen haben und es wird die Name-Tabelle exportiert würde nur eine einzige Zeile für diesen Namen und alle Kontakte zu dieser Reihe zeigen würden. Ich denke, dies nicht sinnvoll wäre, wenn ich tatsächlich wurde auf einem Kontakt Buch zu arbeiten, aber ich benutze es nur um mein Problem zu veranschaulichen.

War es hilfreich?

Lösung

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]

Dann Fremdschlüssel hinzufügen, etc.

Andere Tipps

Erstellen

die neue Tabelle mit einem Fremdschlüssel, die auf die Kontakttabelle zurückverweist. Dann legen Sie die Namen und contactids aus der Kontakttabelle in diese neue Tabelle. Danach können Sie die Spalte „Name“ aus der Kontakt Tabelle löschen.

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

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

ALTER TABLE Contact
DROP Column name;

EDIT:. Da Sie die Frage bearbeitet haben zu erwähnen, dass ein Name mit mehreren Kontakten in Verbindung gebracht werden kann, so ändert es die Dinge in der entgegengesetzten Richtung

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;

Hinweis: Stellen Sie sicher, dass Sie die sachgemäßer Fremdschlüssel zwischen den Kontakt und Namenstabellen mit der NameID auf der Contact-Tabelle erstellen und auch eine UNIQUE-Einschränkung für die Spalte „Name“ in der Name-Tabelle erstellen .

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;

Dies ist eine Möglichkeit, nur eine Zeile pro Namen zu gewährleisten - Sie andere Funktionen für min ersetzen können (wie zum Beispiel max)

.

Ich bin mir nicht sicher, warum Sie dies tun wollen, though. Egal was passiert, werden Sie mit einigen Kontakten am Ende, die ihnen keinen Namen verknüpft haben ...

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`

Das Problem ist das name_id Feld, das mit „0“ ist filles und soll den gleichen Wert wie die ID in der Kontakt-Tabelle hat sein. Hier können Sie die Verwendung LOOP oder ITERATE Anweisung ( wenn Sie mit MySQL).

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top