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

merge..outputを使用して、source.idとtarget.idの間のマッピングを取得します

    私の意見では、これはMERGEと出力の優れた使用法です。私はいくつかのシナリオで使用しましたが、これまでに奇妙なことはありませんでした。たとえば、フォルダーとその中のすべてのファイル(ID)を新しく作成されたフォルダー(GUID)に複製するテストセットアップを次に示します。

    DECLARE @FolderIndex TABLE (FolderId UNIQUEIDENTIFIER PRIMARY KEY, FolderName varchar(25));
    INSERT INTO @FolderIndex 
        (FolderId, FolderName)
        VALUES(newid(), 'OriginalFolder');
    
    DECLARE @FileIndex TABLE (FileId int identity(1,1) PRIMARY KEY, FileName varchar(10));
    INSERT INTO @FileIndex 
        (FileName)
        VALUES('test.txt');
    
    DECLARE @FileFolder TABLE (FolderId UNIQUEIDENTIFIER, FileId int, PRIMARY KEY(FolderId, FileId));
    INSERT INTO @FileFolder 
        (FolderId, FileId)
        SELECT  FolderId, 
                FileId
        FROM    @FolderIndex
        CROSS JOIN  @FileIndex;  -- just to illustrate
    
    DECLARE @sFolder TABLE (FromFolderId UNIQUEIDENTIFIER, ToFolderId UNIQUEIDENTIFIER);
    DECLARE @sFile TABLE (FromFileId int, ToFileId int);
    
    -- copy Folder Structure
    MERGE @FolderIndex fi
    USING   (   SELECT  1 [Dummy],
                        FolderId, 
                        FolderName
                FROM    @FolderIndex [fi]
                WHERE   FolderName = 'OriginalFolder'
            ) d ON  d.Dummy = 0
    WHEN NOT MATCHED 
    THEN INSERT 
        (FolderId, FolderName)
        VALUES (newid(), 'copy_'+FolderName)
    OUTPUT  d.FolderId,
            INSERTED.FolderId
    INTO    @sFolder (FromFolderId, toFolderId);
    
    -- copy File structure
    MERGE   @FileIndex fi
    USING   (   SELECT  1 [Dummy],
                        fi.FileId, 
                        fi.[FileName]
                FROM    @FileIndex fi
                INNER
                JOIN    @FileFolder fm ON 
                        fi.FileId = fm.FileId
                INNER
                JOIN    @FolderIndex fo ON 
                        fm.FolderId = fo.FolderId
                WHERE   fo.FolderName = 'OriginalFolder'
            ) d ON  d.Dummy = 0
    WHEN NOT MATCHED 
    THEN INSERT ([FileName])
        VALUES ([FileName])
    OUTPUT  d.FileId,
            INSERTED.FileId
    INTO    @sFile (FromFileId, toFileId);
    
    -- link new files to Folders
    INSERT INTO @FileFolder (FileId, FolderId)
        SELECT  sfi.toFileId, sfo.toFolderId
        FROM    @FileFolder fm
        INNER
        JOIN    @sFile sfi ON  
                fm.FileId = sfi.FromFileId
        INNER
        JOIN    @sFolder sfo ON 
                fm.FolderId = sfo.FromFolderId
    -- return    
    SELECT  * 
    FROM    @FileIndex fi 
    JOIN    @FileFolder ff ON  
            fi.FileId = ff.FileId 
    JOIN    @FolderIndex fo ON  
            ff.FolderId = fo.FolderId
    


    1. SQLiteで一時テーブルを作成する

    2. SQL Server認証とWindows認証:どちらをいつ使用するか

    3. SQLServerでテーブル値関数を作成する

    4. Javaマルチキャストの存続時間は常に0です