Questions tagged «merge»

可以有条件地插入,更新或删除目标行的SQL语句。

1
合并目标表的子集
我正在尝试使用一条MERGE语句从表中插入或删除行,但是我只想对这些行的子集进行操作。的文档中MERGE有一个措辞非常强烈的警告: 重要的是仅指定目标表中用于匹配目的的列。即,指定目标表中与源表的相应列进行比较的列。不要尝试通过过滤掉ON子句中的目标表中的行来提高查询性能,例如通过指定AND NOT target_table.column_x = value。这样做可能会返回意外和错误的结果。 但这正是我要做的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的记录,那么我将name列更新为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。还有一些线程有时会删除行,因此表数据非常不稳定。进行upsert的线程有时会陷入死锁。该问题看起来类似于此问题中描述的问题。不过,不同之处在于,在我们的例子中,每个线程确实更新或插入一行。 简化的设置如下。该表是堆,上面有两个唯一的非聚集索引 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)(如果为这两列定义了唯一索引),或者您可以使用主键。如果为列定义两个单独的唯一索引,则只能检查一个。 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 (...) 我第一次运行此程序(即,当表为空时)成功,并插入了一行。 我第二次使用相同的数据集运行此错误,但返回错误: 无法创建大小为8410的行,该行大于允许的最大行大小为8060。 为什么第二次尝试合并已经插入的同一行却导致错误。如果该行超过最大行大小,则可能无法将其插入到第一位。 因此,我尝试了两件事(并成功!): 从合并语句中删除“未匹配时”部分 在我尝试合并的同一行上运行更新语句 为什么使用合并更新不会成功,而插入却成功,直接更新也不会成功? 更新: …

1
与OUTPUT合并似乎没有做对的事情
我正在向表添加外键,并删除任何违反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; 但是,此命令似乎是将ModifiedTable中的每一行插入到ModifiedTable_invalid中,而不仅仅是由MERGE命令删除的行。这是怎么回事,以及如何将其删除的行仅放入ModifiedTable_invalid中?
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.