【发布时间】:2022-11-22 03:38:26
【问题描述】:
我有两张桌子:
create table DivisionDocs (RecordID int, division varchar(50), Market1 varchar(25), Market2 varchar(25), Market3 varchar(25), Market4 varchar(25), MarketIsValid varchar(1))
insert into DivisionDocs values (1, 'Division1', 'A1', 'B1', 'C1', 'D1', NULL)
insert into DivisionDocs values (2, 'Division1', 'A2', 'B2', 'C2', 'D2', NULL)
insert into DivisionDocs values (3, 'Division1', 'A3', 'B3', 'C3', 'D3', NULL)
insert into DivisionDocs values (4, 'Division1', 'A5', 'B3', 'C3', 'D3', NULL)
insert into DivisionDocs values (5, 'Division1', 'ALL', 'B3', 'C3', 'D3', NULL)
create table DivisionValidation (division varchar(50), Market1 varchar(25), Market2 varchar(25), Market3 varchar(25), Market4 varchar(25))
insert into DivisionValidation values ('Division1', 'A1', 'B1', 'C1', 'D1')
insert into DivisionValidation values ('Division1', 'A2', 'B2', 'C2', 'D2')
insert into DivisionValidation values ('Division1', 'A3', 'B3', 'C3', 'D3')
我在 DivisionDocs 中有大约 500 万行,在 DivisionValidation 中有 50 万行。
在 MSSQL 中,我试图通过比较两个表来验证 DivisionDocs 与 DivisionValidation 的对比。使用连接查询很容易。在这种情况下,RecordID 的 4 和 5 无效,因为 Market1 不匹配:
update t1
set MarketIsValid = 'x'
from DivisionDocs t1
join DivisionValidation t2
on t1.division = t2.division
and t1.market1 = t2.market1
and t1.market2 = t2.market2
and t1.market3 = t2.market3
and t1.market4 = t2.market4
然而,有时 market# 字段会包含单词 ALL,这基本上意味着它应该始终有效。这基本上意味着它覆盖了整个市场。所以,我正在寻找一种方法将其构建到我的更新查询中。到目前为止,我已经尝试过:
update t1
set MarketIsValid = 'x'
from DivisionDocs t1
join Divisionvalidation t2
on t1.division = t2.division
and
t2.market1 like
case
when t1.market1 = 'ALL' then '%' else t1.market1
end
and
t2.market2 like
case
when t1.market2 = 'ALL' then '%' else t1.market2
end
and
t2.market3 like
case
when t1.market3 = 'ALL' then '%' else t1.market3
end
and
t2.market4 like
case
when t1.market4 = 'ALL' then '%' else t1.market4
end
我也试过:
update DivisionDocs
set market1 = '%' where market1 = 'ALL'
update t1
set MarketIsValid = 'x'
from DivisionDocs t1
join Divisionvalidation t2
on t1.division = t2.division
and t2.market1 like t1.market1
and t2.market2 like t1.market2
and t2.market3 like t1.market3
and t2.market4 like t1.market4
These both work, but take 8-10 minutes to run. I have nonclustered indexes on all columns. Just wanted to see if someone had an idea of a smarter way to run this query faster and more efficiently.
【问题讨论】:
标签: sql-server