sql >> Database >  >> RDS >> Sqlserver

Invoegen van een enkele tabel in meerdere tabellen terwijl de database wordt genormaliseerd

Ik ben niet echt bekend met MERGE dus ik stel een alternatieve oplossing voor met twee INSERT uitspraken:

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

De eerste, INSERT s unieke rijen van col1,col2 in table1 .

De tweede voert een JOIN . uit op tbl en table1 om de FK van table1 te krijgen .

Deze twee INSERT afschriften mogen slechts onder één transactie vallen.

SQL Fiddle




  1. MySQL veel-op-veel relatie met FOREIGN KEYS

  2. MySQL-zelfstudie:MySQL IN-instructie (geavanceerd)

  3. Hoe stel ik de ActiveRecord-querytime-out voor mysql in?

  4. MySQL-query's naar een multidimensionale php-array