好的,我有一个包含以下列的表格
col1 col2 col3
a a 1
a a 2
a b 3
a b 4
a b 5
所以我必须将上面提到的表拆分成多个表,同时将 col1 和 col2 保存在一个单独的表中,并将与 col3 的外键关系的主键保存在另一个表中。这是它的样子。
table1
Id col1 col2
table2
id col3 table1fk
我能够将表拆分为两个表,但它在表 1 中创建了重复行并将它们映射到表 2 中的单行。 我想要实现的是在 table1 中创建一个单独的不同行并将它们映射到 table2 中的多个不同行。
我使用的查询是。
Merge Into table1 As c
Using oldtable ON 1=0
When Not Matched By Target Then
Insert(col1,col2) Values(val1,val2)
Output Inserted.Id,oldtable.val3
Into table2(fktable1,col3);
我可以做些什么来实现它?
最佳答案
我对 MERGE
不是很熟悉,所以我提出了一个使用两个 INSERT
语句的替代解决方案:
BEGIN TRY
BEGIN TRANSACTION
INSERT INTO table1(col1, col2)
SELECT DISTINCT col1, col2 FROM tbl
INSERT INTO table2(col3, table1fk)
SELECT
t.col3,
t1.Id
FROM tbl t
INNER JOIN table1 t1
ON t1.col1 = t.col1
AND t1.col2 = t.col2
COMMIT TRANSACTION
END TRY
BEGIN CATCH
IF (@@TRANCOUNT > 0) BEGIN
ROLLBACK TRANSACTION
END
DECLARE
@ErrorNumber INT,
@ErrorMessage NVARCHAR(4000),
@ErrorState INT,
@ErrorSeverity INT,
@ErrorLine INT
SELECT
@ErrorNumber = ERROR_NUMBER(),
@ErrorSeverity = ERROR_SEVERITY(),
@ErrorState = ERROR_STATE(),
@ErrorLine = ERROR_LINE(),
@ErrorMessage = ERROR_MESSAGE()
RAISERROR(@ErrorMessage, @ErrorSeverity, @ErrorState)
PRINT 'Error detected, transaction rolled back.'
END CATCH
第一个,INSERT
col1,col2
的唯一行到 table1
中。
第二个,对tbl
和table1
执行JOIN
以从table1
获取FK。
这两个INSERT
语句只能在一个事务下。
关于sql - 在规范化数据库时从单个表插入多个表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32110676/