Обновите 2 таблицы вместе, которые используются для получения контента

У меня есть два запроса на обновление, оба используют одно и то же условие для получения данных. После выполнения одного запроса условие не будет связываться с возвратом какой-либо записи. Первый запрос

UPDATE catentdesc
SET PUBLISHED = 0
WHERE CATENTRY_ID IN (
        SELECT CATENTRY.CATENTRY_ID
        FROM CATENTDESC,
            CATENTRY
        WHERE CATENTRY.catenttype_id = 'ProductBean'
            AND CATENTDESC.CATENTRY_ID = CATENTRY.CATENTRY_ID
            AND catentry.buyable = 1
            AND catentdesc.published = 1
            AND CATENTRY.CATENTRY_ID IN (
                SELECT CATENTRY_ID
                FROM CATGPENREL
                WHERE CATALOG_ID = 10001
                )
            AND catentry.markfordelete = 0 minus
        SELECT CATENTRY.CATENTRY_ID
        FROM CATENTDESC,
            CATENTRY
        WHERE CATENTRY.catenttype_id = 'ProductBean'
            AND CATENTDESC.CATENTRY_ID = CATENTRY.CATENTRY_ID
            AND catentry.buyable = 1
            AND catentdesc.published = 1
            AND CATENTRY.CATENTRY_ID IN (
                SELECT CATENTRY_ID
                FROM CATGPENREL
                WHERE CATALOG_ID = 10051
                )
            AND catentry.markfordelete = 0
        )

Второй запрос

UPDATE catentry
SET CATENTRY.BUYABLE = 0
WHERE CATENTRY_ID IN (
        SELECT CATENTRY.CATENTRY_ID
        FROM CATENTDESC,
            CATENTRY
        WHERE CATENTRY.catenttype_id = 'ProductBean'
            AND CATENTDESC.CATENTRY_ID = CATENTRY.CATENTRY_ID
            AND catentry.buyable = 1
            AND catentdesc.published = 1
            AND CATENTRY.CATENTRY_ID IN (
                SELECT CATENTRY_ID
                FROM CATGPENREL
                WHERE CATALOG_ID = 10001
                )
            AND catentry.markfordelete = 0 minus
        SELECT CATENTRY.CATENTRY_ID
        FROM CATENTDESC,
            CATENTRY
        WHERE CATENTRY.catenttype_id = 'ProductBean'
            AND CATENTDESC.CATENTRY_ID = CATENTRY.CATENTRY_ID
            AND catentry.buyable = 1
            AND catentdesc.published = 1
            AND CATENTRY.CATENTRY_ID IN (
                SELECT CATENTRY_ID
                FROM CATGPENREL
                WHERE CATALOG_ID = 10051
                )
            AND catentry.markfordelete = 0
        )

Проблема в том, что мне нужно обновить catentry и catentdesc, но если один обновит другой, я не смогу обновить, потому что запрос условия не вернет никакого результата.

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

Есть ли способ обновить обе таблицы одновременно в DB2?

1 ответ

Решение

Поскольку вы не указываете платформу, я собираюсь предположить, что DB2 для Linux/Unix/Windows. Если это не правильно, он все еще может работать на других платформах, но я не уверен.

Вы можете объявить временную таблицу и сохранить результаты для использования в своих обновлениях позже.

Кроме того, я думаю, что мне удалось упростить некоторые критерии запроса с помощью LEFT JOIN, Похоже, вы принимаете все CATENTRIES которые из каталога 10001и затем удаляет записи (с теми же критериями), которые также существуют в 10051, Если это так, то LEFT JOIN ниже следует сделать то же самое. Я не могу проверить это (без примеров данных), так что вы можете проверить это самостоятельно и убедиться в результатах.:)

DECLARE GLOBAL TEMPORARY TABLE SESSION.CATENTRY AS
    SELECT C.CATENTRY_ID
    FROM CATENTRY   C
    JOIN CATENTDESC D
      ON D.CATENTRY_ID = C.CATENTRY_ID
    JOIN CATGPENREL G
      ON G.CATENTRY_ID = C.CATENTRY_ID
    LEFT JOIN CATGPENREL G2
      ON G2.CATENTRY_ID = C.CATENTRY_ID
     AND G2.CATALOG_ID = 10051
    WHERE C.catenttype_id = 'ProductBean'
      AND C.buyable       = 1
      AND C.markfordelete = 0 
      AND D.published     = 1
      AND G.CATALOG_ID    = 10001
      AND G2.CATENTRY_ID IS NULL
ON COMMIT PRESERVE ROWS
;

UPDATE catentdesc
SET PUBLISHED = 0
WHERE CATENTRY_ID IN (
WHERE CATENTRY_ID IN (
    SELECT CATENTRY_ID
    FROM SESSION.CATENTRY
)
;

UPDATE catentry
SET BUYABLE = 0
WHERE CATENTRY_ID IN (
    SELECT CATENTRY_ID
    FROM SESSION.CATENTRY
)
;

DROP TABLE SESSION.CATENTRY
;
Другие вопросы по тегам