2016-07-21 5 views
1

Ich habe eine Tabelle mit drei Spalten mit doppelten Werten, aber keine Doppelzeilen. Jetzt möchte ich diese Tabelle in zwei Tabellen mit eindeutigen Werten und einer Linktabelle aufteilen. Ich denke, das Problem klarer wird, wenn ich Ihnen zeigen Beispieltabellen:Geteilte Tabelle in zwei Tabellen plus eine Verknüpfungstabelle

Original: 
| ID | Column_1 | Column_2 | Column_3 | 
|----|----------|----------|----------| 
| 1 | A  | 123  | A1  | 
| 2 | A  | 123  | A2  | 
| 3 | B  | 234  | A2  | 
| 4 | C  | 456  | A1  | 

Table_1 
| ID | Column_1 | Column_2 | 
|----|----------|----------| 
| 1 | A  | 123  | 
| 2 | B  | 234  | 
| 3 | C  | 456  | 

Table_2 
| ID | Column_3 | 
|----|----------| 
| 1 | A1  | 
| 2 | A2  | 

Link-Table 
| ID | fk1 | fk2 | 
|----|-----|-----| 
| 1 | 1 | 1 | 
| 2 | 1 | 2 | 
| 3 | 2 | 2 | 
| 4 | 3 | 1 | 

Table_1 ich so erstellt:

INSERT INTO Table_1(Column_1, Column_2) 
SELECT DISTINCT Column_1, Column_2 FROM Original 
WHERE Original.Column_1 NOT IN (SELECT Column_1 FROM Table_1) 

table_2 ich auf die gleiche Weise erstellt.

Die Frage ist nun, wie man die Link-Tabelle erstellt? Die ursprüngliche Tabelle wird ständig erweitert, daher sollten nur neue Einträge hinzugefügt werden. Muss ich einen Cursor verwenden, oder gibt es einen besseren Weg?

LÖSUNG:

MERGE Link_Table AS LT 
USING (SELECT DISTINCT T1.ID AS T1ID, T2.ID AS T2ID FROM Original AS O 
        INNER JOIN Table_1 AS T1 ON T1.Column_1 = O.Column_1 
        INNER JOIN Table_2 AS T2 ON T2.Column_3 = O.Column_3) AS U 
ON LT.fk1 = U.T1ID 
WHEN NOT MATCHED THEN 
INSERT (fk1, fk2) 
VALUES (U.T1ID, U.T2ID); 

Antwort

0

Sie können alle 3 Tabellen JOIN richtigen Daten für die Verbindungstabelle zu erhalten:

--INSERT INTO [Link-Table] 
SELECT t1.ID, 
     t2.ID 
FROM Original o 
INNER JOIN Table_1 t1 
    ON t1.Column_1 = o.Column_1 
INNER JOIN Table_2 t2 
    ON t2.Column_3 = o.Column_3 

Wenn die ursprüngliche Tabelle wird wachsen, dann müssen Sie MERGE verwenden, zu aktualisieren/neue Daten einfügen

+0

Danke für die Antwort. Ich habe es gelöst. Siehe meinen ursprünglichen Beitrag zur Lösung. – Suiram83

0

Sie müssen Ihr Original, Table_1 und Table_2 innerlich verbinden, um das gewünschte Ergebnis zu erhalten.

Versuchen Sie wie folgt, es ähnelt Gofr1 Post.

DECLARE @orginal TABLE (
    ID INT 
    ,Column_1 VARCHAR(10) 
    ,Column_2 INT 
    ,Column_3 VARCHAR(10) 
    ) 
DECLARE @Table_1 TABLE (
    ID INT 
    ,Column_1 VARCHAR(10) 
    ,Column_2 INT 
    ) 
DECLARE @Table_2 TABLE (
    ID INT 
    ,Column_3 VARCHAR(10) 
    ) 

Insert into @orginal values 
(1,'A',123,'A1') 
,(2,'A',123,'A2') 
,(3,'B',234,'A2') 
,(4,'C',456,'A1') 

Insert into @Table_1 values 
(1,'A',123) 
,(2,'B',234) 
,(3,'C',456) 

Insert into @Table_2 values 
(1,'A1') 
,(2,'A2') 

SELECT O.ID 
    ,T1.ID 
    ,T2.ID 
FROM @orginal O 
INNER JOIN @Table_1 T1 ON T1.Column_1 = O.Column_1 
INNER JOIN @Table_2 T2 ON T2.Column_3 = O.Column_3 
Verwandte Themen