下面的代碼將學生記錄從StudentsTableifHighSchoolersTable移動IsHighSchoolStudent = 1。兩個表具有相同的列 - StudentId nvarchar(50)、subjectId nvarchar(50) 和 IsHighSchoolStudent(位)。
| 學生卡 | 主題 ID | 是高中學生 |
|---|---|---|
| 美國廣播公司 | 子1 | 1 |
| 定義 | 子2 | 0 |
| xyz | 子3 | 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;
uj5u.com熱心網友回復:
我還是不明白為什么你的老板需要這樣MERGE。如果他希望它是一個單一的陳述,因為這有助于他在晚上睡得更好,為什么不DELETE ... OUTPUT INTO呢?
DELETE dbo.StudentsTable
OUTPUT deleted.StudentId, deleted.SubjectId
INTO dbo.HighSchoolersTable(StudentId, SubjectId)
WHERE IsHighSchoolStudent = 1;
- 示例db<>fiddle
堅持你用MERGE這個,就像讓你用掃帚掃牛奶一樣。
uj5u.com熱心網友回復:
MERGE可以“同時”做這些事情的任意組合:
INSERT INTO tableX
UPDATE tableX
DELETE FROM tableX
它不能一次修改兩個表。它不能“同時”執行這些操作:
INSERT INTO tableX
DELETE FROM tableY
因此,您必須使用two陳述句,一個 INSERT 和一個 DELETE。您的原始查詢很好。使用output ... into洗掉子句可以使您通過在主鍵上使用聯接而不是 where 來獲得更好的性能。盡管如此,代表學生的那張桌子,我懷疑桌子的大小是否足以證明(即使是這么一點)額外的作業是合理的。
當然,你也可以用兩個MERGEs 代替,但這不僅危險,而且很愚蠢。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/474594.html
上一篇:如何從文本中洗掉某些前導字符
