0

table1からtable2にデータを挿入する必要がある状況があります。挿入する前に、特定の行がtable2にすでに存在するかどうかを確認し、存在する場合は、行のcol2、col4を更新するだけです。存在しない場合は、新しい行を挿入します。

SQLSERVER2008R2を使用しています。どうすればこれを達成できますか?

状況は少し変わりました。このようなものが必要です。

DECLARE @table1 TABLE 
(id int not null, ahccs int not null, info varchar(25), flag varchar(2))
DECLARE @table2 TABLE 
(id int not null, ahccs int not null, info varchar(25), flag varchar(2))

INSERT INTO @table1
VALUES(1, 1223, 'et', 'X')
INSERT INTO @table1
VALUES(2, 321, 'et', 'X')
INSERT INTO @table1
VALUES(3, 134, 'et', 'X' )
INSERT INTO @table1
VALUES(4, 168, 'et', 'X' )
INSERT INTO @table1
VALUES(5, 123, 'et', 'X' )


INSERT INTO @table2
VALUES(1, 1223, 'dt', 'y' )
INSERT INTO @table2
VALUES(2, 456, 'dt', 'y' )
INSERT INTO @table2
VALUES(3, 123, 'dt', 'y' )
INSERT INTO @table2
VALUES(4, 193, 'dt', 'y' )
--SELECT * FROM @table1

SELECT * FROM @table2

MERGE
INTO    @table2 t2
USING   @table1 t1
ON      t2.id = t1.id or t2.ahccs = t1.ahccs
WHEN NOT MATCHED THEN
UPDATE
SET     flag = 'z'
INSERT VALUES (100, t1.ahccs, t1.info, 'l');

私が抱えている2つの問題は次のとおりです。1)マージは複数のステップをサポートしていないと思います。2)WHEN NOT MATCHEDの場合、更新は許可されません。

お知らせ下さい。

ありがとうございました。

4

2 に答える 2

3

マージを使用する必要があります。これにより、更新または挿入しようとしているデータ(「アップサート」)を現在テーブルにあるデータと照合し、一致の有無に基づいてさまざまなアクションを実行できます。

MERGE Stock S
USING Trades T ON S.Stock = T.Stock
WHEN MATCHED THEN
    UPDATE SET Qty += Delta
WHEN NOT MATCHED THEN
    INSERT VALUES (Stock, Delta);

この例はここからです。

于 2012-04-25T20:59:39.857 に答える
2
MERGE
INTO    table2 t2
USING   table1 t1
ON      t2.id = t1.t2_id
WHEN NOT MATCHED THEN
INSERT  
VALUES  (t1.col1, t1.col2, ...)
WHEN MATCHED THEN
UPDATE
SET     col2 = t1.col2,
        col4 = t1.col4
于 2012-04-25T20:59:00.833 に答える