我有一个包含三列的表,其中包含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);
答案 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