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
就等于让你用扫帚扫牛奶
如果 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
就等于让你用扫帚扫牛奶