sql - 在规范化数据库时从单个表插入多个表

标签 sql sql-server database sql-server-2008 relational-database

好的,我有一个包含以下列的表格

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

第一个,INSERTcol1,col2 的唯一行到 table1 中。

第二个,对tbltable1 执行JOIN 以从table1 获取FK。

这两个INSERT 语句只能在一个事务下。

SQL Fiddle

关于sql - 在规范化数据库时从单个表插入多个表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32110676/

相关文章:

sql - 在哪里可以查看 SQL Server 启动/停止日志?

sql - "table A left outer join table B ON TRUE"是什么意思?

sql - 在 SQL Server 中获取当前系统时间

sql - 如何在SQL中拆分和显示单词的不同字母?

php - 如何在 MySQL 中设置年份数据类型

java - 如何创建一个允许 NULL 值与 Hibernate 注释的唯一约束?

sql-server - 单个 Big SQL Server 查找表

sql - 比较 SQL Server 中索引 View 和存储过程的性能

php - 使用提交表单更新数据库

java - 在另一个模型中获取模型列表的正确方法