0

我在存储过程中导入 Excel 数据并将记录存储在临时表中。我想验证主表中具有相应值的几列的值。

我在这个临时表中又添加了一列,即:Status,它保存 NULL 或 SKIP 作为值。

例如,临时表包含一列,即 Location。客户将预先填写的 Excel 表格发送给我们,并填写所有列。在这样的列上是这个位置列。通常位置的拼写不正确。如果说任何位置,新泽西州,Excel 工作表可能包含拼写为 New Jarsey。

我有一个位置主表,其中还存储了正确的位置名称和 ID。我想将临时表中的位置名称与主表中的相应位置名称相匹配。如果位置不匹配,我在临时表中将状态列标记为 SKIP。

临时表中有几列的值需要与其对应的主表值匹配。

有什么方法可以更有效、更快地验证这些列值吗?我想逐行匹配 Locations 以及类似的其他列值。

4

1 回答 1

0

如果我理解正确(实际上显示一些测试数据和预期结果会有很大帮助),您可以使用一系列EXISTS表达式或一系列外连接。这是一个使用 2 个不同列的示例,每个列都有一个相应的“主表”:

-- set up test data
declare @RawData table  (Location varchar(100) not null primary key, Country varchar(100) not null, Status char(4) null)
declare @LocationMaster table (Location varchar(100) not null primary key)
declare @CountryMaster table (Country varchar(100) not null primary key)

insert into @RawData (Location, Country) values ('New Jersey', 'USA'), ('New Jarsey', 'USA'), ('New York', 'USAA'), ('New Yoik', 'United States')
insert into @LocationMaster (Location) values ('New Jersey'), ('New York')
insert into @CountryMaster (Country) values ('USA')

-- option 1: EXISTS

update @RawData
set Status = 'SKIP'
from @RawData r
where 
    not exists (select * from @LocationMaster where Location = r.Location)
    or not exists (select * from @CountryMaster where Country = r.Country)

select * from @RawData

-- reset status
update @RawData set Status = null

-- option 2: OUTER JOIN

update @RawData
set Status = 'SKIP'
from 
    @RawData r
    left outer join @LocationMaster lm on lm.Location = r.Location
    left outer join @CountryMaster cm on cm.Country = r.Country
where
    lm.Location is null 
    or cm.Country is null

select * from @RawData

您可以在 SSMS 中分析这两个计划,以确定哪一个对您的数据集更有效。

于 2013-05-15T20:13:16.213 回答