sql >> データベース >  >> RDS >> Sqlserver

データベースの正規化中に単一のテーブルから複数のテーブルに挿入する

    MERGEについてはあまり詳しくありません。 そのため、2つの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に 。

    2つ目は、JOINを実行します tblで およびtable1 table1からFKを取得するには 。

    これらの2つのINSERT ステートメントは1つのトランザクションのみである必要があります。

    SQLフィドル




    1. SQL Server(T-SQL)でユーザー定義データ型の名前を変更する

    2. 大きなテーブルを結合するときのpostgresクエリが遅い

    3. ユーザーロールを管理するCodeigniter

    4. 関数でのnode-mysqlの使用