如何正确地将这两个查询合并为一个更新?
how to properly merge these 2 query into one update?
这目前有效,但我想更改更新语句以包括在其下方插入的操作,这可能吗?
UPDATE cas
SET [Locked] = CASE WHEN cas.Locked <> @TargetState AND cas.LastChanged = filter.SourceDateTime THEN @TargetState ELSE cas.[Locked] end,
OUTPUT inserted.Id, inserted.Locked, CASE WHEN inserted.Locked = @TargetState AND
inserted.LastChanged = filter.SourceDateTime THEN 1
WHEN inserted.LastChanged <> filter.SourceDateTime THEN -1 -- out of sync
WHEN deleted.Locked = @TargetState THEN -2 -- was not in a good state
ELSE 0 END --generic failure
INTO @OUTPUT
FROM dbo.Target cas WITH(READPAST, UPDLOCK, ROWLOCK) INNER JOIN @table filter ON cas.Id = filter.Id
INSERT INTO @OUTPUT
SELECT filter.id, NULL, when cas.id is not null -3 -- row was/is locked
else -4 end --not found
FROM @table filter left join dbo.target cas with(nolock) on filter.id = cas.id
WHERE NOT EXISTS (SELECT 1 FROM @OUTPUT result WHERE filter.id = result.UpdatedId)
我不认为你想要的是可能的。
- 您从 table 开始更新。假设这个 table 包含一组 ID,比如 1 到 6
- 您加入的临时 table 包含一组不同的 ID,这些 ID 可能部分重叠(例如,4 到 9)
- 您使用内部联接发出更新。仅更新第 4 至 6 行
- 输出子句只获取修改行的数据,所以你只获取第 4 到 6 行的数据
- 如果将其翻转为外连接(这样所有临时 table 行都被选中),您仍然只更新第 4 行到第 6 行,输出子句仍然只踢出第 4 行到第 6 行的数据6
所以,不,我认为没有办法在一个 SQL 声明中实现这个目标。
这目前有效,但我想更改更新语句以包括在其下方插入的操作,这可能吗?
UPDATE cas
SET [Locked] = CASE WHEN cas.Locked <> @TargetState AND cas.LastChanged = filter.SourceDateTime THEN @TargetState ELSE cas.[Locked] end,
OUTPUT inserted.Id, inserted.Locked, CASE WHEN inserted.Locked = @TargetState AND
inserted.LastChanged = filter.SourceDateTime THEN 1
WHEN inserted.LastChanged <> filter.SourceDateTime THEN -1 -- out of sync
WHEN deleted.Locked = @TargetState THEN -2 -- was not in a good state
ELSE 0 END --generic failure
INTO @OUTPUT
FROM dbo.Target cas WITH(READPAST, UPDLOCK, ROWLOCK) INNER JOIN @table filter ON cas.Id = filter.Id
INSERT INTO @OUTPUT
SELECT filter.id, NULL, when cas.id is not null -3 -- row was/is locked
else -4 end --not found
FROM @table filter left join dbo.target cas with(nolock) on filter.id = cas.id
WHERE NOT EXISTS (SELECT 1 FROM @OUTPUT result WHERE filter.id = result.UpdatedId)
我不认为你想要的是可能的。
- 您从 table 开始更新。假设这个 table 包含一组 ID,比如 1 到 6
- 您加入的临时 table 包含一组不同的 ID,这些 ID 可能部分重叠(例如,4 到 9)
- 您使用内部联接发出更新。仅更新第 4 至 6 行
- 输出子句只获取修改行的数据,所以你只获取第 4 到 6 行的数据
- 如果将其翻转为外连接(这样所有临时 table 行都被选中),您仍然只更新第 4 行到第 6 行,输出子句仍然只踢出第 4 行到第 6 行的数据6
所以,不,我认为没有办法在一个 SQL 声明中实现这个目标。