Запись должна быть загружена только для цели по сценарию - PullRequest
0 голосов
/ 31 января 2020

У меня есть две таблицы: таблица этапов и таблица целей. Я хочу, чтобы в моей целевой таблице содержались действительные значения CustomerScore. В настоящее время мы вставляем в сцену и загружаем в наш целевой стол. Мы не хотим загружать недопустимые значения (-8.0000). Однако, если в нашей целевой таблице есть customerNumber с допустимым значением, мы хотели бы вывести номера из списков, присвоив ему customerScore из (-8,0000). Это должно быть единственное время, когда это значение попадает в целевую таблицу, поэтому запись для этого CustomerNumber уже должна быть в целевом объекте, чтобы обновить эту запись, которая в данный момент находится в целевой таблице. Моя инструкция создания ниже

CREATE TABLE stg.CustomerAppreciation (
    CustomerId INT identity(1, 1)
    ,CustomerNumber VARCHAR(50)
    ,CustomerScore DECIMAL(5, 4)
    );

CREATE TABLE ods.CustomerAppreciation (
    CustomerId INT identity(1, 1)
    ,CustomerNumber VARCHAR(50)
    ,CustomerScore DECIMAL(5, 4)
    );

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

1     123      0.8468
2     143      1.0342 

Теперь допустим, что мы хотим вывести из эксплуатации CustomerID = 2, потому что в промежуточную стадию вставлена ​​запись как

3     143      -8.0000

Целевая таблица должна быть обновлена ​​для этого CustomerNumber. Создание моей целевой таблицы выглядит следующим образом:

1     123      0.8468
2     143      -8.0000

Это должно быть единственным разом, когда мы разрешаем -8,0000 в таблицу, когда уже существует CustomerNumber. Если customerNumber не существует в целевой таблице и по какой-то причине в подготовке указывается -8.0000, его нельзя допускать. Как мне написать запрос на обновление, который обновляет запись в моей целевой таблице, только если этот сценарий существует и предотвращает - 8.0000 от входа, если он не существует?

Ответы [ 2 ]

0 голосов
/ 31 января 2020

Не уверен, что я полностью понимаю специфику, но вот некоторый синтаксис, который должен помочь, по крайней мере, начать работу ...

BEGIN;
 MERGE ods.CustomerAppreciation AS X  
 USING (SELECT CustomerNumber,CustomerScore FROM stg.CustomerAppreciation) AS Y (CustomerNumber,CustomerScore)  
 ON (X.CustomerNumber = Y.CustomerNumber)  
 WHEN MATCHED /*AND Y.CustomerNumber = '-8.0000'*/ THEN
 UPDATE SET CustomerScore = Y.CustomerScore  
 WHEN NOT MATCHED BY X /*AND Y.CustomerNumber = '-8.0000'*/ THEN  
 INSERT (CustomerNumber,CustomerScore)  
 VALUES (Y.CustomerNumber,Y.CustomerScore)  
 OUTPUT $action, inserted.* INTO #MyTempTable;  
END;
0 голосов
/ 31 января 2020

Предполагая, что промежуточная таблица содержит только одну строку для каждого номера клиента (если нет, сгруппируйте ее, чтобы отобразить самый высокий идентификатор клиента), вы можете использовать объединение для выполнения этой функции. Без проверки точного синтаксиса, что-то вроде этого:

MERGE ods.CustomerAppreciation AS Target
USING (SELECT * FROM stg.CustomerAppreciation WHERE CustomerScore >= 0) AS Source   ON Target.CustomerNumber = Source.CustomerNumber
WHEN MATCHED
    -- choose your match criteria here
    --AND Source.CustomerId > Target.CustomerId 
    AND NOT EXISTS (SELECT Target.* INTERSECT SELECT Source.*)
THEN UPDATE
    SET Target.CustomerScore = Source.CustomerScore;
...