当临时表位置上仅存在基于修订id的值站点程序集时,如何进行状态更新?

vjrehmav  于 2021-07-27  发布在  Java
关注(0)|答案(1)|浏览(197)

我处理sql server 2012查询,面临一个问题:当临时表上至少有一个装配场记录时,我无法更新状态 #rev 匹配临时表 #location 基于修订id。
预期结果是:

Revision Id   Status    
------------------------
1900          Found
2000          Not Found
5000          Found

例如:修订id 1900状态为 Found 因为临时表中的修订id为1900 #rev 等于 LocRevisionId 在温度表中 #location 临时表中的装配地点 #rev 等于 locAssemblySiteId 在温度表中 #location 至少一次。

修订id 2000状态为 Not Found 因为修订版id 2000在 #rev 等于 LocRevisionId#location 和装配现场 #rev 不等于 locAssemblySiteId#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)
6jjcrrmo

6jjcrrmo1#

你可以用 exists 和一个 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;

如果每次修订的位置表中最多只有一行,则 left 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
)

相关问题