2


ソース テーブルからすべての行を削除し、削除された行がターゲット テーブルにまだ存在しない場合にのみ、削除された行をターゲット テーブルに挿入する必要があります。
単一のSQLを使用して発行することは可能ですか?

コードは私がこれまでに試したものです(エラーはありますが)。ありがとう!

create table #Target (column01 varchar(100)  
        ,employee_number varchar(10)  
                    )
 Insert into #Target (column01, employee_number)  
values ('2','222')  

create table #Srs (column01 varchar(100)  
        ,employee_number varchar(10)  
                )  

 Insert into #Srs (column01, employee_number)  
 values ('1','111')  
    ,('2','222')  
    ,('3','333')  
        ,('4','444')  


;with cteTable as (Select column01, employee_number from #Srs)  
insert into #Target (column01, employee_number)  
select * from (Delete from cteTable output deleted.column01, deleted.employee_number)  t  
where   not exists (select 1  
        from #Target t1  
        where t1.employee_number = t.employee_number)  

2,'222' は、";with cteTable.." の呼び出し時に #Target に挿入しないでください。

SQL フィドルのデモ

4

2 に答える 2

3

コンポーザブル DML はかなり制限されています。

#Targetただし、定義を変更すると、これを行うことができます

CREATE TABLE #Target
  (
     column01        VARCHAR(100),
     employee_number VARCHAR(10) PRIMARY KEY WITH (IGNORE_DUP_KEY=ON)
  )

INSERT INTO #Target
            (column01,
             employee_number)
VALUES      ('2',
             '222')

CREATE TABLE #Srs
  (
     column01        VARCHAR(100),
     employee_number VARCHAR(10)
  )

INSERT INTO #Srs
            (column01,
             employee_number)
VALUES      ('1', '111'),
            ('2', '222'),
            ('3', '333'),
            ('4', '444');

WITH cteTable
     AS (SELECT column01,
                employee_number
         FROM   #Srs)
INSERT INTO #Target
            (column01,
             employee_number)
SELECT * from (Delete from cteTable output deleted.column01, deleted.employee_number)  t  
于 2013-08-06T05:56:15.653 に答える
2

ステートメントは 1 つだけである必要がありますか? そうでない場合は、これを使用できます。

begin transaction;

insert into Target(column01, employee_number)
select column01, employee_number
from Srs with (updlock, holdlock)
except
select column01, employee_number
from Target;

delete from Srs;

commit transaction;
于 2013-08-06T06:14:08.820 に答える