sql - 当临时表位置上仅存在基于修订 ID 的值站点程序集时,如何进行状态更新?
问题描述
我处理 SQL Server 2012 查询时遇到一个问题:当临时表上的至少一个装配站点记录与基于修订 ID 的临时表#rev
匹配时,我无法更新状态。#location
预期结果是:
Revision Id Status
------------------------
1900 Found
2000 Not Found
5000 Found
例如:Revision Id 1900 状态将是Found
因为临时表中的 Revision Id 1900#rev
等于LocRevisionId
临时表中的#location
并且临时表中的装配站点至少#rev
等于locAssemblySiteId
临时表中的一次。#location
和
Revision Id 2000 状态将是Not Found
因为 Revision Id 2000 in#rev
等于LocRevisionId
in#location
并且 Assembly Site in#rev
不等于locAssemblySiteId
in#location
至少一次。
create table #rev
(
RevisionId int,
AssemblySiteId int,
Status nvarchar(200)
)
insert into #rev (RevisionId, AssemblySiteId)
values (1900, 200), (2000, 300), (5000, 800)
create table #location
(
locRevisionId int,
locAssemblySiteId int
)
insert into #location (locRevisionId, locAssemblySiteId)
values (1900, 200), (1900, 150),
(2000, 290), (2000, 310),
(5000, 800), (5000, 820)
解决方案
您可以使用exists
and 一个case
表达式:
update #rev
set status = case
when exists (
select 1
from #location l
where
l.locRevisionId = #rev.RevisionId
and l.locAssemblySiteId = #rev.AssemblySiteId
)
then 'Found'
else 'Not Found'
end;
如果每个修订版的位置表中始终最多有一行,那么 aleft join
也是一个可能的选项:
update r
set r.status = case when l.locRevisionId is null then 'Not Found' else 'Found' end
from #rev r
left join #location l
on l.locRevisionId = r.RevisionId
and l.locAssemblySiteId = r.AssemblySiteId
)
推荐阅读
- html - EJS 渲染 HTML
- opencv - 使用 emeocv 时如何解决“OpenCV 错误:cvCheckTrainData 中的错误参数(训练数据必须是浮点矩阵)”错误?
- macos - 使用 sed 查找/替换不适用于整个文本文件
- r - 错误:`data` 必须是数据框,或其他可被`fortify()`强制的对象
- android - VSTS Cordova Android Build Job 卡住了
- angularjs - AngularJS、TypeScript、组件架构怪异行为
- shell - 优化 curl 命令的输出
- skype-for-business - Skype for Business Online 2016 UCWA
- c++ - bitbake grpc 交叉编译/配置失败并出现错误 c-ares::cares 引用文件 /usr/lib/libcares.so.2.2.0
- php - WhereHas 如果计数大于 2 则返回