SQL-триггер - проверка в другой таблице, если существует, то обновить еще вставить

MSSQL

У меня две таблицы. Таблица A и Таблица B

Таблица А

+----+----+-----+
| ID |Name|Marks|
+----+----+-----+
| 1  |ABC |50   |
+----+----+-----+
| 2  |BCD |80   |
+----+----+-----+

ТаблицаB

+----+----+-----+
| ID |Name|Marks|
+----+----+-----+
| 1  |ABC |50   |
+----+----+-----+
| 4  |PQR |10   |
+----+----+-----+

При каждой вставке в TableA я хочу проверить, есть ли тот же идентификатор в TableB или нет. Если ID отсутствует в TableB, вставьте запись в TableB, если ID найден в TableB, обновите запись в TableB.

Как я могу написать триггер на TableA для этих вставок.


person Teknas    schedule 16.06.2019    source источник
comment
Отметьте свой вопрос используемой базой данных и покажите код, который вы пытались выполнить. Это не кажется особенно сложным, если вы можете написать триггер и оператор update.   -  person Gordon Linoff    schedule 16.06.2019
comment
Действительный стандарт SQL ANSI / ISO будет использовать обновляемое представление с опцией проверки.   -  person Raymond Nijland    schedule 16.06.2019


Ответы (1)


Этот тип логики немного сложен в SQL Server, поскольку он обрабатывает вставки как наборы, а не как отдельные строки.

Итак, вы можете также попробовать update и insert для всех значений, используя такую ​​логику:

create trigger on tablea after insert
begin
    -- update everything that matches
    update b
        set marks = a.marks
        from tableb b join
             inserted a
             on b.id = a.id;

    -- insert what doesn't match
    insert into tableb
        select a.id, a.name, a.marks
        from inserted a
        where not exists (select 1 from tableb b where b.id = a.id);
end;
person Gordon Linoff    schedule 16.06.2019
comment
@Larnu. . . Спасибо. На самом деле он работает с tableb, но мне неприятно, что SQL Server позволяет это. - person Gordon Linoff; 16.06.2019