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

親子関係のあるSQL一括挿入、順序は保持されますか?

    ターゲット テーブルと同じ構造を持つ 2 つのステージング テーブルを作成しますが、recno 列で ID を使用しないでください。

    create table parentTmp (
       recno int,
       groupCode int,
       parentdata varchar(80)
    );
    
    create table childTmp (
       parentrecno int not null,
       childdata varchar(80)
    )
      

    recno/parentrecno の値をそのままにして、データをステージング テーブルに一括読み込みします。

    次に、マージ を使用できます および 出力 ステージング テーブルからデータを移動します。

    -- Table variable to hold mapping between 
    -- SourceRecno and TargetRecno
    declare @recno table(SourceRecno int, TargetRecno int);
    
    -- Merge data from parentTmp to parent
    -- Output old and new recno to @recno
    merge parent T
    using parentTmp S
    on 0=1
    when not matched then
      insert (groupCode, parentdata)
        values (S.groupCode, S.parentData)
    output S.recno, inserted.recno into @recno;
    
    -- Copy data from childTmp to child
    -- Use @recno to get the new recno
    insert into child(parentrecno, childdata)
    select R.TargetRecno, C.childdata
    from childTmp as C
      inner join @recno as R
        on C.parentrecno = R.SourceRecno;
      

    これは、SQL Server 2008 (およびそれ以降と思われます) でのみ機能します。



    1. MySQLWorkbenchはアイドル時に接続をドロップします

    2. 結果としてmysqlユニオンの列が間違っています

    3. 社会的距離を保ちながらチームを管理するための5つのヒント

    4. PHP:大きなファイルのアップロード後にmysqlクエリがスキップ/無視されましたか?