拆分表中的两个表加一个链接表

时间:2016-07-21 07:43:33

标签: sql-server

我有一个包含三列的表,其中包含double值,但没有双行。现在我想在具有唯一值和链接表的两个表中拆分此表。当我向你展示示例表时,我认为问题变得更清楚了:

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我是这样创建的:

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)

表_2我以同样的方式创建。

现在的问题是,如何创建链接表? 原始表确实在不断增长,因此只应添加新条目。 我是否必须使用光标,还是有更好的方法?

解决方案:

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);

2 个答案:

答案 0 :(得分:0)

您可以加入所有3个表以获取链接表的正确数据:

--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

如果原始表格增长,则需要使用MERGE更新/插入新数据。

答案 1 :(得分:0)

您必须内部加入Original,Table_1和Table_2才能获得所需的结果。

尝试这样,它类似于gofr1帖子。

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