首页 > 解决方案 > 当临时表位置上仅存在基于修订 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等于LocRevisionIdin#location并且 Assembly Site in#rev不等于locAssemblySiteIdin#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)

标签: sqldatabasetsqljoinsql-server-2012

解决方案


您可以使用existsand 一个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
)

推荐阅读