用于获取内容的2个表一起更新

时间:2013-12-04 06:29:31

标签: sql db2 wcs

我有两个更新查询,两个都使用相同的条件来获取数据。一旦运行一个查询,条件就不会打包返回任何记录。 第一个查询

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 个答案:

答案 0 :(得分:1)

由于您没有指定平台,我将假设DB2 for Linux / Unix / Windows。如果这不正确,它仍然可以在其他平台上运行,但我不确定。

您可以声明temporary table,并存储结果以便稍后在您的更新中使用。

此外,我认为我可以使用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
;
相关问题