【问题标题】:Inserting From a single Table into multiple tables while Normalizing the database在规范化数据库时从单个表插入多个表
【发布时间】:2015-11-13 15:34:15
【问题描述】:

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

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

我能够将表拆分为两个表,但它在 table1 中创建了重复的行并将它们映射到 table2 中的单行。 我想要实现的是在 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);

我可以做些什么不同的事情来实现它?

【问题讨论】:

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


    【解决方案1】:

    我对@9​​87654322@ 不是很熟悉,所以我提出了一个使用两个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
    

    第一个,INSERTs 的唯一行 col1,col2table1

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

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

    SQL Fiddle

    【讨论】:

    • 是的,我同意。保持简单而不是使用 MERGE。您不需要它提供的 UPDATE/DELETE 功能,因此两个 INSERT 语句应该可以以最少的复杂性来解决问题...
    • 是的,它似乎比我的方法简单得多,也更容易理解。真的感谢您的帮助。作为应用程序开发人员,深入研究数据库很糟糕。
    • 没问题。很高兴我能帮上忙。
    猜你喜欢
    • 2011-07-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-15
    • 2021-10-09
    • 2017-04-03
    • 1970-01-01
    相关资源
    最近更新 更多