SQL 服务器 - 使用 MERGE 将记录移动到不同的 table

SQL Server - Move records to a different table using MERGE

如果 IsHighSchoolStudent = 1,下面的代码 学生记录从 StudentsTable 移动到 HighSchoolersTable。两个表具有相同的列 - StudentId nvarchar(50)、subjectId nvarchar(50) 和 IsHighSchoolStudent(位)。

StudentId SubjectId IsHighSchoolStudent
abc sub1 1
def sub2 0
xyz sub3 1

作为迁移规则的一部分,代码需要转换为 MERGE 语句。 (是的,我知道使用 MERGE https://sqlblog.org/merge 的危险。我已经和我的老板吵架了,但他不会让步)。我不知道要为合并语句“匹配”什么以及在何处添加 IsHighSchoolStudent = 1 条件。

BEGIN TRANSACTION;
    INSERT INTO HighSchoolersTable
    SELECT *
    FROM StudentsTable
    WHERE IsHighSchoolStudent = 1;
    
    DELETE FROM originalTable
    WHERE IsHighSchoolStudent = 1;
COMMIT;

MERGE 可以“同时”执行这些事情的任意组合:

INSERT INTO tableX
UPDATE tableX
DELETE FROM tableX

不能一次修改两个table。它不能“同时”执行这些操作:

INSERT INTO tableX
DELETE FROM tableY

因此,您必须使用 two 语句,一个 INSERT 和一个 DELETE。您的原始查询很好。在删除中使用 output ... into 子句可以使您通过在主键上使用联接而不是 where 来获得更好的性能。不过,table 代表学生,我怀疑 table 的大小是否足以证明(即使是这么小的)额外工作是合理的。

当然,你也可以用两个MERGE来代替,但这不仅危险,而且很愚蠢。

我还是不明白为什么你的老板需要这样 MERGE。如果他希望它是一个单一的陈述,因为出于某种原因这有助于他晚上睡得更好,为什么不 DELETE ... OUTPUT INTO

DELETE dbo.StudentsTable 
  OUTPUT deleted.StudentId, deleted.SubjectId
  INTO dbo.HighSchoolersTable(StudentId, SubjectId)
  WHERE IsHighSchoolStudent = 1;

非要你用MERGE就等于让你用扫帚扫牛奶