• I would create temp table or CTE and then use that to do insert update. The "ID" field is your PK of the table.

    IF OBJECT_ID('tempdb..#Source','u') IS NOT NULL

    DROP TABLE #Source

    SELECT dbsource.ID

    ,dbsource.software_name_raw

    ,dbref.software_name_amended

    ,ToInsert = CASE WHEN dbref.software_name_raw IS NULL

    THEN 1

    ELSE 0

    END

    INTO #Source

    FROM dbo.BigTable dbsource

    LEFT JOIN (

    SELECT software_name_raw,software_name_amended

    FROM RefTable

    GROUP BY software_name_raw,software_name_amended

    ) dbref

    ON dbref.software_name_raw = dbsource.software_name_raw

    UPDATE BigTable

    SET software_name_raw = src.software_name_amended

    FROM #Source src

    JOIN dbo.BigTable

    ON BigTable.ID = src.ID

    WHERE src.ToInsert = 0

    INSERT INTO dbo.RefTable

    (software_name_raw

    ,software_name_amended

    )

    SELECT software_name_raw

    ,'Needs Updating'

    FROM #Source

    WHERE ToInsert = 1