我有两个更新查询,两个都使用相同的条件来获取数据。一旦运行一个查询,条件就不会打包返回任何记录。 第一个查询
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中一次更新两个表?
答案 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
;