Чтение дополнительных данных на основе значения составного первичного ключа - PullRequest
0 голосов
/ 03 октября 2018

У меня есть OLTP (источник), откуда данные должны перемещаться в DWH (место назначения) в пошаговом режиме.Исходная таблица имеет составной первичный ключ на Loan_id, AssetID, как показано ниже.

LOAN_ID, ASSETID, REC_STATUS
'12848','13170', 'F'

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

Есть идеи, как это можно сделать с помощью T-SQL Query?

Характеристики: Источник - это база данных MYSQL, а место назначения - MSSQL 2012. Соединение устанавливается с использованием связанного сервера.

Ответы [ 2 ]

0 голосов
/ 04 октября 2018

Есть несколько вещей, которые вы можете попробовать.Работа со связанным сервером и незнание специфики этой настройки, а также объема данных может привести к проблемам с производительностью.

Если вас не волнуют изменения в существующих записях или удаления, просто оставьте внешнююПри соединении вы получите все записи, которые еще не были вставлены в пункт назначения:

SELECT          [s].[LOAD_ID]
              , [s].[ASSETID]
              , [s].[REC_STATUS]
FROM            [LinkedServer].[Database].[schema].[SourceTable] [s]
LEFT OUTER JOIN [DestinationTable] [d]
    ON [s].[LOAN_ID] = [d].[LOAN_ID]
       AND [s].[ASSETID] = [d].[ASSETID]
WHERE           [d].[LOAN_ID] IS NULL;

Если вы беспокоитесь об изменениях, вы все равно можете использовать левое внешнее поле и искать значение NULL в пункте назначения или различия в полезначений, но тогда вам понадобится дополнительный оператор обновления.

SELECT          [s].[LOAD_ID]
              , [s].[ASSETID]
              , [s].[REC_STATUS]
FROM            [LinkedServer].[Database].[schema].[SourceTable] [s]
LEFT OUTER JOIN [DestinationTable] [d]
    ON [s].[LOAN_ID] = [d].[LOAN_ID]
       AND [s].[ASSETID] = [d].[ASSETID]
WHERE           [d].[LOAN_ID] IS NULL --Records from source not in destination
                OR (
                        --This evaluates those in the destination, but then checks for changes in field values.
                       [d].[LOAN_ID] IS NOT NULL
                       AND (
                               [s].[REC_STATUS] <> [d].[REC_STATUS]
                               OR [s].[SomOtherField] <> [d].[SomeOtherField]
                           )
                   );

--The above insert into some landing or staging table on the destination side and then you could do a MERGE.

Если нам нужно беспокоиться об удалениях.Запись была удалена из источника, и вы больше не хотите ее видеть в месте назначения.Переверните левый край, чтобы найти записи в пункте назначения, которых больше нет в источнике:

DELETE [d]
FROM           [DestinationTable] [d]
LEFT OUTER JOIN [LinkedServer].[Database].[schema].[SourceTable] [s]
    ON [s].[LOAN_ID] = [d].[LOAN_ID]
   AND [s].[ASSETID] = [d].[ASSETID]
WHERE           [s].[LOAD_ID] IS NULL;

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

MERGE [DestinationTable] [t]
USING [LinkedServer].[Database].[schema].[SourceTable] [s]
ON [s].[LOAN_ID] = [d].[LOAN_ID]
   AND [s].[ASSETID] = [d].[ASSETID]
WHEN MATCHED THEN UPDATE SET [REC_STATUS] = [s].[REC_STATUS]
WHEN NOT MATCHED BY TARGET THEN INSERT (
                                           [REC_STATUS]
                                       )
                                VALUES ( [s].[REC_STATUS] )
WHEN NOT MATCHED BY SOURCE THEN DELETE;

При работе со слиянием, вы должны следить за этим утверждением:

WHEN NOT MATCHED BY SOURCE THEN DELETE;

Если вы не работаете свесь набор записей вы можете потерять записи в вашем пункте назначения.Например, вы ограничили набор результатов, который вы извлекли из источника, в промежуточную таблицу, теперь вы объединяете промежуточную таблицу с конечным пунктом назначения, и все, что вне этого, будет удалено в вашем пункте назначения.Вы можете решить эту проблему, ограничив вашу цель с помощью CTE, Google: «объединить в cte в качестве цели».Это если у вас есть дата, которую вы можете отфильтровать.

Если у вас есть столбец даты, это всегда полезно, особенно своего рода столбец даты изменения / обновления, когда новые записи вставляются или обновляются.Затем вы можете отфильтровать по своему источнику только те записи, которые вас интересуют.

0 голосов
/ 03 октября 2018

Инкрементальные нагрузки обычно имеют дату, управляющую ими.

Вы можете использовать составной ключ в поиске.На этот вопрос отвечали много раз.

Добавьте поиск и измените тест для перенаправления без совпадений (по умолчанию это ошибка).

В основном вы проверяете, существует ли ключ в месте назначения.

Если ключ существует, то это обновление (совпадение).

Если ключ не существует (нет совпадения), то это вставка.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...