Шаг данных SAS Объединить/изменить 2 набора данных, но сохранить константы целостности (pk) в основном наборе данных

У меня есть код, как показано ниже

data master;
input id name $ status $;
datalines;
1    B    b
2    C    c
3    A    a
;;;;
run;

PROC SQL;
ALTER TABLE master
ADD PRIMARY KEY (id);
QUIT;

data transaction;
input name $ status $;
datalines;
A    f
F    f
E    e
D    d
B    z
C    x
;;;;
run;

proc sort data = master;
by name;
run;

proc sort data = transaction;
by name;
run;

Я хотел бы объединить набор данных транзакций с основным набором данных и обновить значение из мастера со значением из набора данных транзакций. Для этого я мог бы использовать код ниже

data have;
retain _maxID; 
merge have addon;
by name;
if id = . then id = _maxID + 1;
_maxID = max(id, _maxID);
run;

Результат будет выглядеть так

id   name   status
3    A      f
1    B      z
2    C      x
4    D      d
5    E      e
6    F      f

Однако основной набор данных сбрасывается, и я потерял ограничение первичного ключа в столбце id основного набора данных.

Насколько я знаю, команда слияния, установки и обновления создает новый набор данных, а не обновляет текущий набор данных.

Оператор изменения — единственный, который обновляет текущий набор данных, но замена оператора слияния из приведенного выше кода на изменение не работает.

Я мог бы решить эту проблему, восстановив первичное ограничение в основном наборе данных после слияния, но это не очень хорошее решение.

Есть ли другой способ, кроме этого? Помощь приветствуется и заранее благодарна.


person Luke Henz    schedule 09.04.2013    source источник


Ответы (1)


Как вы сказали, единственным оператором, который не создает новый набор данных, является MODIFY, но вы можете использовать его для достижения своей цели. Существует хороший документ SUGI по использованию MODIFY здесь

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

data master;
modify master transaction;
by name;
select (_IORC_);
    when (%sysrc(_SOK)) replace;
    when (%sysrc(_DSENMR)) do;
        id=_n_;
        output;
        _error_=0;
        end;
    otherwise; 
end;
run;

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

Ссылка: - аналогичный оператор для слияния sql в sas

person Longfish    schedule 09.04.2013
comment
Кит, я добавил ссылку в ваш ответ на аналогичный вопрос, на который я ответил ранее, используя modify/iorc. Код немного менее общий, но более описательный, поэтому может быть полезен. - person Robert Penridge; 10.04.2013
comment
Спасибо за ответ и очень полезную статью Sugi. Как и в ответе Роба, я не знал, что выбор можно использовать внутри шага данных. Еще раз спасибо, Кит и Роб. - person Luke Henz; 10.04.2013