タグ付けされた質問 「merge」

1
ターゲット表のサブセットをマージします
MERGEステートメントを使用してテーブルの行を挿入または削除しようとしていますが、それらの行のサブセットのみを操作したいです。のドキュメントにMERGEは、かなり強い言葉で警告があります: マッチングの目的で使用されるターゲットテーブルの列のみを指定することが重要です。つまり、ソース表の対応する列と比較されるターゲット表の列を指定します。AND NOT target_table.column_x = valueを指定するなど、ON句でターゲットテーブルの行をフィルタリングしてクエリのパフォーマンスを向上させないでください。これを行うと、予期しない誤った結果が返される場合があります。 しかし、これはまさにMERGE仕事をするために私がしなければならないように見えるものです。 私が持っているデータは、次のようなアイテムとカテゴリ(たとえば、どのアイテムがどのカテゴリに含まれているか)の標準的な多対多の結合テーブルです。 CategoryId ItemId ========== ====== 1 1 1 2 1 3 2 1 2 3 3 5 3 6 4 5 私がする必要があるのは、特定のカテゴリのすべての行を新しいアイテムのリストで効果的に置き換えることです。これを行う最初の試みは次のようになります。 MERGE INTO CategoryItem AS TARGET USING ( SELECT ItemId FROM SomeExternalDataSource WHERE CategoryId = 2 ) AS SOURCE ON SOURCE.ItemId = …

2
単一のクエリを使用して挿入または更新する方法は?
私は、主キーと自動インクリメントされた名前の列IDを持つテーブルテストを持っています。レコードがない場合にのみ、新しいレコードを挿入します。たとえば、 入力はid = 30122および名前= johnです ID 30122のレコードがある場合、名前列をjohnに更新し、レコードがない場合、新しいレコードを挿入します。 私は次のような2つのクエリを使用して行うことができます select * from test where id=30122 いくつかのレコードがある場合は、使用できます update test set name='john' where id=3012 またはレコードがない場合は、使用できます insert into test(name) values('john') しかし、私は単一のクエリを使用したいですか? 誰かがその可能性を伝えることができますか?

1
このMERGEステートメントによりセッションが強制終了されるのはなぜですか?
MERGEデータベースに対して発行される以下のステートメントがあります: MERGE "MySchema"."Point" AS t USING ( SELECT "ObjectId", "PointName", z."Id" AS "LocationId", i."Id" AS "Region" FROM @p1 AS d JOIN "MySchema"."Region" AS i ON i."Name" = d."Region" LEFT JOIN "MySchema"."Location" AS z ON z."Name" = d."Location" AND z."Region" = i."Id" ) AS s ON s."ObjectId" = t."ObjectId" WHEN NOT …

4
マージステートメント自体のデッドロック
次の手順があります(SQL Server 2008 R2): create procedure usp_SaveCompanyUserData @companyId bigint, @userId bigint, @dataTable tt_CoUserdata readonly as begin set nocount, xact_abort on; merge CompanyUser with (holdlock) as r using ( select @companyId as CompanyId, @userId as UserId, MyKey, MyValue from @dataTable) as newData on r.CompanyId = newData.CompanyId and r.UserId = newData.UserId and …

1
Mergeステートメントのロックオプションは何ですか?
MERGEステートメントを実行するストアドプロシージャがあります。 マージを実行すると、デフォルトでテーブル全体がロックされるようです。 トランザクション内でこのストアドプロシージャを呼び出して、他の処理も実行していて、影響を受ける行のみをロックしたい場合。 ヒントを試しMERGE INTO myTable WITH (READPAST)てみましたが、ロックが少なかったようです。しかし、ms docに、主キーでさえもバイパスして重複キーを挿入する可能性があるという警告がありました。 これが私のテーブルスキーマです: CREATE TABLE StudentDetails ( StudentID INTEGER PRIMARY KEY, StudentName VARCHAR(15) ) GO INSERT INTO StudentDetails VALUES(1,'WANG') INSERT INTO StudentDetails VALUES(2,'JOHNSON') GO CREATE TABLE StudentTotalMarks ( Id INT IDENTITY PRIMARY KEY, StudentID INTEGER REFERENCES StudentDetails, StudentMarks INTEGER ) GO INSERT INTO …

2
条件付きINSERTおよびSELECTよりもOUTPUTを使用したMERGEの方が良いでしょうか?
多くの場合、「存在しない場合は挿入」という状況が発生します。Dan Guzmanのブログには、このプロセスをスレッドセーフにする方法に関する優れた調査があります。 文字列をから整数に単純にカタログする基本的なテーブルがありSEQUENCEます。ストアドプロシージャでは、値の整数キーが存在する場合は取得するか、値の整数キーをINSERT取得してから結果の値を取得する必要があります。dbo.NameLookup.ItemName列には一意性の制約があるため、データの整合性は危険にさらされていませんが、例外は発生しません。 それはIDENTITYそうではないので、私は得ることができず、特定の場合にSCOPE_IDENTITYは値がありますNULL。 私の状況INSERTでは、テーブルの安全性だけを扱う必要があるため、次のMERGEように使用するのがより良い方法かどうかを判断しようとしています。 SET NOCOUNT, XACT_ABORT ON; DECLARE @vValueId INT DECLARE @inserted AS TABLE (Id INT NOT NULL) MERGE dbo.NameLookup WITH (HOLDLOCK) AS f USING (SELECT @vName AS val WHERE @vName IS NOT NULL AND LEN(@vName) > 0) AS new_item ON f.ItemName= new_item.val WHEN MATCHED THEN UPDATE SET …

1
MERGEデッドロック防止
私たちのデータベースの1つに、複数のスレッドによって集中的に同時にアクセスされるテーブルがあります。スレッドはを介して行を更新または挿入しますMERGE。行を時々削除するスレッドもあるので、テーブルデータは非常に不安定です。アップサートを実行するスレッドは時々デッドロックに悩まされます。この問題は、この質問で説明されている問題に似ています。ただし、違いは、私たちの場合、各スレッドが1行だけを更新または挿入することです。 簡略化されたセットアップは次のとおりです。テーブルは、2つの一意の非クラスター化インデックスを持つヒープです。 CREATE TABLE [Cache] ( [UID] uniqueidentifier NOT NULL CONSTRAINT DF_Cache_UID DEFAULT (newid()), [ItemKey] varchar(200) NOT NULL, [FileName] nvarchar(255) NOT NULL, [Expires] datetime2(2) NOT NULL, CONSTRAINT [PK_Cache] PRIMARY KEY NONCLUSTERED ([UID]) ) GO CREATE UNIQUE INDEX IX_Cache ON [Cache] ([ItemKey]); GO 典型的なクエリは DECLARE @itemKey varchar(200) = 'Item_0F3C43A6A6A14255B2EA977EA730EDF2', @fileName nvarchar(255) …

1
単一のテーブルで複数の一意の制約を使用すると、設計が悪いと見なされますか?
私はPostgreSQLのINSERT INTO .. ON CONFLICT (..) DO UPDATE ..構文を見ていましたが、それを使用して複数の一意制約チェックを実行することはできません。つまり、複合一意インデックスを列名で参照するかON CONFLICT (Name, Symbol)(一意のインデックスがこれらの2つの列に対して定義されている場合)、または主キーを使用します。列に2つの個別の一意のインデックスを定義する場合、チェックできるのは1つだけです。 CREATE TABLE student (Id int primary key, Name varchar(50), Symbol varchar(50), CONSTRAINT col1_unique UNIQUE (Name), CONSTRAINT col2_unique UNIQUE (Symbol) ); INSERT INTO student (Id, Name, Symbol) VALUES (1, 'John', 'J'), (2, 'David', 'D'), (3, 'Will', 'W'); INSERT INTO …

1
SQL Serverのマージ行サイズオーバーフロー-「サイズの行を作成できません。」
データをマージしようとしているターゲットテーブルには、約660列があります。マージのコード: MERGE TBL_BM_HSD_SUBJECT_AN_1 AS targetTable USING ( SELECT * FROM TBL_BM_HSD_SUBJECT_AN_1_STAGING WHERE [ibi_bulk_id] in (20150520141627106) and id in(101659113) ) AS sourceTable ON (...) WHEN MATCHED AND ((targetTable.[sampletime] <= sourceTable.[sampletime])) THEN UPDATE SET ... WHEN NOT MATCHED THEN INSERT (...) VALUES (...) 初めてこれを実行したとき(つまり、テーブルが空のとき)は成功し、1行挿入しました。 同じデータセットを使用してこれを2回実行したときに、エラーが返されました。 許容最大行サイズ8060より大きいサイズ8410の行を作成できません。 すでに挿入されている同じ行を2回目にマージしようとしたときにエラーが発生したのはなぜですか。この行が最大行サイズを超えた場合、そもそも挿入できない可能性があります。 だから私は2つのことを試しました(そして成功しました!): マージステートメントから「WHEN NOT MATCHED」セクションを削除する マージしようとした同じ行で更新ステートメントを実行する …

1
OUTPUTを使用したMERGEが正しく動作していないようです
テーブルに外部キーを追加し、FKに違反する行を削除して、ModifiedTable_invalidテーブルにコピーしています。スクリプトの一部として、次のMERGEコマンドを取得しました。 MERGE ModifiedTable t1 USING TargetTable tt ON t1.JoinColumn = tt.JoinColumn WHEN MATCHED THEN UPDATE SET t1.FkColumn = tt.FkSource WHEN NOT MATCHED BY SOURCE THEN DELETE OUTPUT DELETED.* INTO ModifiedTable_invalid; ただし、このコマンドは、MERGEコマンドによって削除された行だけでなく、ModifiedTableからModifiedTable_invalidにすべての行を挿入しているようです。何が起こっているのですか?削除された行のみをModifiedTable_invalidに配置するにはどうすればよいですか?
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.