在Excel中,我有一个动态的长列表(> 1000),包括组件及其各自的资产类型。示例:
Component Asset Type
0738.D100.L00.55 9211.D108.D07.01_02.02
0738.D100.L00.71 0738.D100.L00.55_04.04
0738.D100.M02.55 0738.D100.M00.60_03.03
0990.OH05.A00.09 0738.D100.M00.60_03.03
其中一些组合可能在SQL数据库中不存在。我想要一个输出这些组合的查询。
可以按以下方式请求组件及其各自的资产类型
Select C.Code, AT.Code From astComponents C
Join astAssetTypes AT ON AT.Id = C.AssetTypeId
我创建了一个使用临时表进行比较的方法,但经过1250种组合测试,该方法运行的速度很慢,约为6.5秒,其中创建表的时间约为2秒。
Create Table
#Temp(Component nvarchar(50) Collate Latin1_General_BIN, AssetType nvarchar(50) Collate Latin1_General_BIN)
Insert Into #Temp (Component, AssetType) Values ('0738.D100.L00.55','9211.D108.D07.01_02.02');
Insert Into #Temp (Component, AssetType) Values ('0738.D100.L00.71','0738.D100.L00.55_04.04');
Insert Into #Temp (Component, AssetType) Values ('0738.D100.M02.55','0738.D100.M00.60_03.03');
Insert Into #Temp (Component, AssetType) Values ('0990.OH05.A00.09','0738.D100.M00.60_03.03');
--more Inserts left out
Select Distinct
Compare.Component,
Compare.AssetType
From astComponents C
Join astAssetTypes AT ON AT.Id = C.AssetTypeId
Right Join #Temp Compare ON Compare.AssetType = AT.Code And Compare.Component = C.Code
Where C.Code is null
在the Fiddle中,如果我们使用最上面的示例作为检查数据,则预期结果将低于下面的值。这些组件-资产类型组合在fiddle数据库中不存在。
Component Asset Type
0738.D100.M02.55 0738.D100.M00.60_03.03
0990.OH05.A00.09 0738.D100.M00.60_03.03
我想要一个更快的方法。帮助将不胜感激
答案 0 :(得分:0)
此查询应执行您想要的操作:
select c.*
from #temp c join
astAssetTypes t
on t.AssetType = c.AssetType
where not exists (select 1
from components co
where co.component = c.code and
co.AssetTypeId = t.id
)
对于此查询,您希望在以下位置建立索引:
astAssetTypes(AssetType, id)
components(component, AssetTypeId)