Сообщить о недостающих данных в базе данных - PullRequest
1 голос
/ 27 июня 2019

SQL Fiddle


У меня есть динамический длинный (> 1000) список компонентов и их соответствующих типов активов в Excel. Пример:

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

В на скрипке ожидаемый результат будет ниже, если мы используем верхний пример в качестве наших данных для проверки. Эти комбинации компонентов и типов активов не существуют в базе данных fiddle.

Component                   Asset Type
0738.D100.M02.55            0738.D100.M00.60_03.03
0990.OH05.A00.09            0738.D100.M00.60_03.03

Я хочу более быстрый метод. Помощь будет принята с благодарностью

1 Ответ

0 голосов
/ 27 июня 2019

Этот запрос должен делать то, что вы хотите:

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)
...