0

2 つの update query があり、どちらも同じ条件を使用してデータを取得しています。1 つのクエリが実行されると、条件によってレコードが返されなくなります。最初のクエリ

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
        )

2 番目のクエリ

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 で一度に両方のテーブルを更新する方法はありますか?

4

1 に答える 1

1

プラットフォームを指定していないので、DB2 for Linux/Unix/Windows を想定します。これが正しくない場合でも、他のプラットフォームで動作する可能性がありますが、よくわかりません。

一時テーブルを宣言し、後で更新に使用するために結果を保存できます。

さらに、LEFT JOIN. CATENTRIEScatalog からすべてを取得してから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
;
于 2013-12-04T16:04:17.873 に答える