Обновление таблицы SQL Server на основе значений в столбце - PullRequest
0 голосов
/ 24 июня 2019

В моей базе данных SQL Server 11 таблиц, в которых есть одинаковые столбцы, 10 - это вспомогательные таблицы, а 1 - главная таблица, в которую будут объединены данные из 10 таблиц. 10 таблиц постоянно обновляются время от времени, ниже столбец, который есть в моих 11 таблицах:

[DATE], [SOURCE], [DESTINATION], [REFERENCE#], [ITEMCODE], [DESCRIPTION],
[UM], [PRICE], [QTY], [AMOUNT], [MFGDATE], [EXPDATE], [LOT#], [TRANS], [CONSIGNOR], [DRDATE]

Когда пользователь обновляет таблицу, т.е. Table1, основная таблица должна автоматически обновляться на основе столбцов SOURCE и DESTINATION. Я знаю, что есть оператор Merge, где вы можете обновлять, вставлять и удалять все одновременно, но моя проблема с этим заключается в удалении, поскольку Table1 будет иметь только частичные данные по сравнению с основной таблицей, это удалит остальные данные в основной таблице, которых нет в Table1.

Я новичок в SQL Server и не могу справиться с этим самостоятельно, поэтому я здесь ищу идеи и некоторую помощь.

Ответы [ 2 ]

1 голос
/ 24 июня 2019

Вы можете попробовать использовать триггер после вставки в таблицу Table1:

CREATE TRIGGER your_trigger
ON Table1
AFTER INSERT AS
BEGIN
    UPDATE a
    SET SOURCE = b.SOURCE, DESTINATION = b.DESTINATION
    FROM Main a
    INNER JOIN INSERTED b
        ON a.ID = b.ID
END
GO

Я предполагаю, что Table1 и основная таблица связаны через столбец с именем Id. Однако вы можете обновить логику объединения, чтобы использовать те столбцы, которые определяют, как соединить две таблицы.

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

прочитав ваши комментарии и предложения, а также прочитав намного больше на другом сайте, я пришел к следующему:

MERGE DelTrans2 as trgt
USING testTable1 src
    ON trgt.SOURCE = Src.SOURCE
    AND trgt.DESTINATION = Src.DESTINATION
    AND trgt.REFERENCE# = Src.REFERENCE#
    AND trgt.ITEMCODE = Src.ITEMCODE
    AND trgt.ID = Src.ID
WHEN NOT MATCHED BY TARGET
    AND Src.ID = 1001 THEN
    INSERT(DATE, SOURCE, DESTINATION, REFERENCE#, ITEMCODE, DESCRIPTION, UM, PRICE, QTY, AMOUNT, MFGDATE, EXPDATE, LOT#, TRANS, CONSIGNOR, DRDATE, ID)
    VALUES(DATE, SOURCE, DESTINATION, REFERENCE#, ITEMCODE, DESCRIPTION, UM, PRICE, QTY, AMOUNT, MFGDATE, EXPDATE, LOT#, TRANS, CONSIGNOR, DRDATE, ID)
WHEN MATCHED AND 
    (
        ISNULL(trgt.DATE, '') <> ISNULL(Src.DATE, '')
        OR
        ISNULL(trgt.SOURCE, '') <> ISNULL(Src.SOURCE, '')
        OR
        ISNULL(trgt.DESTINATION, '') <> ISNULL(Src.DESTINATION, '')
        OR
        ISNULL(trgt.REFERENCE#, '') <> ISNULL(Src.REFERENCE#, '')
        OR
        ISNULL(trgt.ITEMCODE, '') <> ISNULL(Src.ITEMCODE, '')
        OR
        ISNULL(trgt.DESCRIPTION, '') <> ISNULL(Src.DESCRIPTION, '')
        OR
        ISNULL(trgt.UM, '') <> ISNULL(Src.UM, '')
        OR
        ISNULL(trgt.PRICE, '') <> ISNULL(Src.PRICE, '')
        OR
        ISNULL(trgt.QTY, '') <> ISNULL(Src.QTY, '')
        OR
        ISNULL(trgt.AMOUNT, '') <> ISNULL(Src.AMOUNT, '')
        OR
        ISNULL(trgt.MFGDATE, '') <> ISNULL(Src.MFGDATE, '')
        OR
        ISNULL(trgt.EXPDATE, '') <> ISNULL(Src.EXPDATE, '')
        OR
        ISNULL(trgt.LOT#, '') <> ISNULL(Src.LOT#, '')
        OR
        ISNULL(trgt.TRANS, '') <> ISNULL(Src.TRANS, '')
        OR
        ISNULL(trgt.CONSIGNOR, '') <> ISNULL(Src.CONSIGNOR, '')
        OR
        ISNULL(trgt.DRDATE, '') <> ISNULL(Src.DRDATE, '')
        OR
        ISNULL(trgt.ID, '') <> ISNULL(Src.ID, '')
    )
    AND Src.ID = 1001
THEN
    UPDATE SET DATE = Src.DATE, SOURCE = Src.SOURCE, DESTINATION = Src.DESTINATION, REFERENCE# = Src.REFERENCE#, ITEMCODE = Src.ITEMCODE, DESCRIPTION = Src.DESCRIPTION, UM = Src.UM, PRICE = Src.PRICE, QTY = Src.QTY, AMOUNT = Src.AMOUNT, MFGDATE = Src.MFGDATE, EXPDATE = Src.EXPDATE, LOT# = Src.LOT#, TRANS = Src.TRANS, CONSIGNOR = Src.CONSIGNOR, DRDATE = Src.DRDATE, ID = Src.ID
WHEN NOT MATCHED BY SOURCE
    AND trgt.ID = 1001 THEN
    DELETE;

Я знаю, что это не самый эффективный способ, но он отлично работает счто я хочу.

Спасибо за вашу помощь.

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