Запрос на выбор записей, которые не отображаются в БД - PullRequest
0 голосов
/ 26 июня 2019

Я пытаюсь добавить недостающие данные в БД и поэтому пытаюсь собрать эти недостающие данные с помощью запросов.

В моей таблице Excel у меня есть два столбца: col A заполнен кодами компонентов, аcol J содержит соответствующие коды типов активов.

Я хочу найти все несуществующие комбинации компонентов и типов активов в одном запросе .

В настоящее время я зацикливаюсьчерез лист Excel, как в следующем примере:

arr = Range("B3:J5000")
For i = 1 To 5000-2
    Set rs = cnn.Execute("Select Top 1 AT.Code From astComponents C Join astAssetTypes AT ON AT.Id = C.AssetTypeId Where C.Code = '" & arr(i, 1) & "' And AT.Code = '" & arr(i, 9) & "'")
    If rs.EOF Then
        'Missing data was found
    End If
Next i

Это, однако, не к моему удовлетворению.Я хочу закончить с набором записей с отсутствующими комбинациями типа компонент-актив.Это значительно улучшило бы скорость моей программы (в 120 раз быстрее)

Я пытался использовать Except, но это не привело к записям, где я ожидал их:

Select Distinct C.Code, AT.Code 
FROM dbo.astComponents C 
JOIN dbo.astAssetTypes AT ON AT.Id = C.AssetTypeId 

WHERE (C.Code= '0738.D100' AND AT.Code = '0738.M00_03.03') Or (C.Code= '0738.D101' AND AT.Code = '0738.L00_04.04')

Except Select C.Code, AT.Code From astComponents C Join astAssetTypes AT ON AT.Id = C.AssetTypeId

РЕДАКТИРОВАТЬ
Как уже упоминалось, желаемым выходом должны быть отсутствующие комбинации компонента-актива.Пример:

Component      Asset Type
0738.D101      0990.D10_03.03
0150.C101      0738.L00_04.04

SQL-Fiddle
Задача : проверьте, существуют ли указанные ниже комбинации компонента-актива в скриптебаза данных.Если нет, добавьте эти комбинации к выводу.

Component      Asset Type
0738.D100      0990.D10_03.03
0738.D101      0990.D10_03.03
0150.C101      0738.L00_04.04
0738.L004      0738.M00_03.03
0990.D103      0738.M00_03.03

1 Ответ

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

Не окончательный ответ, так как метод ниже МЕДЛЕННО

В этом методе я использую цикл, который заполняет переменную, которая помогает заполнить временную таблицу всеми комбинациями типа компонент-актив, которые необходимо проверить. Затем я сравниваю значения в базе данных с временной таблицей, используя CTE.

Создание временной таблицы и выполнение второго запроса длится 5 секунд (с 1250 записями в #Temp), что я считаю слишком медленным

arr = Range("B3:J" & LRow)
For i = 1 To LRow - 2
    ComponentCodeTemp = ComponentCodeTemp & "Insert Into #Temp (Component, AssetType) Values ('" & arr(i, 1) & "','" & arr(i, 9) & "');"
Next i

'Query
Set rs = getdata("Create Table #Temp(Component nvarchar(50) Collate Latin1_General_BIN, AssetType nvarchar(50) Collate Latin1_General_BIN) " & ComponentCodeTemp & _
    "; With Compare As (Select T.* From #Temp T), DBD As (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) " & _
    "Select * From DBD")

Лучшая разметка для запроса SQL:

WITH 
    Compare AS (
                Select T.* FROM #Temp T
               ),
    DBD AS (
            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
            )
Select * From DBD
...