首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在DB2中,可以在合并语句或更新语句的表表达式中使用CTE吗?

在DB2中,可以在合并语句或更新语句的表表达式中使用CTE吗?
EN

Stack Overflow用户
提问于 2019-08-30 15:20:25
回答 1查看 1.3K关注 0票数 0

在DB2-400 v7r3m0中,是否可以在合并或更新语句的表表达式中使用公共表表达式(CTE)?

this article,从表面上看,它与我的问题完全相同。然而,这篇文章已有8年的历史,没有任何OP、答复或评论表明DB2的版本。多年来,DB2的平台和版本可能发生了变化或改进,现在允许我做我想做的事情。

下面是一个SQL脚本,它生成三个结果表。有临时表、表表达式和CTE。除了带有CTE3的注释部分之外,整个过程都正常工作,这将显示以下错误:

SQL Error [42601]: [SQL0199] Keyword AS not expected. Valid tokens: FULL LEFT CROSS INNER RIGHT EXCEPTION.

我也尝试了更新语句,并收到了一个类似的错误,表明不同的关键字是预期的。

注释部分是上面的语句的一个近乎精确的副本,唯一的更改是CTE。thE注释部分可以工作吗.?

代码语言:javascript
复制
-- CREATE HYPOTHETICAL TABLE. USE A CTE.
DECLARE GLOBAL TEMPORARY TABLE SESSION.TESTTABLE
    AS  (   WITH CTE1 AS (  SELECT      *
                            FROM        TABLE(VALUES(1,'BE'),(2,'BI'),(3,'BN')
                                             ) AS TMP (ID,PCLASS)
                         )
            SELECT  *
            FROM    CTE1
        )   WITH DATA WITH REPLACE ;

-- CREATE TABLE WITH CHANGES TO PUT IN PREVIOUS TABLE.
DECLARE GLOBAL TEMPORARY TABLE SESSION.NEWVALUES
    AS  (   SELECT      *
            FROM        TABLE(VALUES(1,'XX'),(2,'YY'),(3,'ZZ')
                        ) AS TMP (ID,QCLASS)
        )   WITH DATA WITH REPLACE ;

-- SHOW THE FIRST TABLE.
SELECT      *
FROM        SESSION.TESTTABLE ;

-- MAKE A SIMPLE WORKING CTE, AND USE IT TO SHOW THE 2ND TABLE.
WITH        CTE2 AS (   SELECT  ID, QCLASS 
                        FROM    SESSION.NEWVALUES
                    )
SELECT      * 
FROM        CTE2 ;

-- THE FOLLOWING WORKS. IT MERGES CHANGES FROM 2ND TABLE INTO THE 1ST.
MERGE INTO      SESSION.TESTTABLE AS TT
USING           (   SELECT  ID, QCLASS 
                    FROM    SESSION.NEWVALUES
                )   AS NV   ON TT.ID = NV.ID
--WHEN MATCHED    THEN              -- UPDATE ALL RECORDS
WHEN MATCHED    AND TT.ID=2 THEN    -- UPDATE ONLY RECORD #2
                    UPDATE SET TT.PCLASS = NV.QCLASS ;

-- THIS FOLLOWING DOESN'T WORK AND DISPLAYS THIS ERROR:
--      SQL Error [42601]: [SQL0199] Keyword AS not expected. 
--      Valid tokens: FULL LEFT CROSS INNER RIGHT EXCEPTION.
/*
MERGE INTO      SESSION.TESTTABLE AS TT
USING           (   WITH CTE3 AS (   SELECT  ID, QCLASS 
                                     FROM    SESSION.NEWVALUES
                                 )
                    SELECT  * 
                    FROM    CTE3     -- CTE USED HERE
                )   AS NV   ON TT.ID = NV.ID
--WHEN MATCHED    THEN              -- UPDATE ALL RECORDS
WHEN MATCHED    AND TT.ID=2 THEN    -- UPDATE ONLY RECORD #2
                    UPDATE SET TT.PCLASS = NV.QCLASS ;
*/

-- SHOW THE FIRST TABLE AGAIN, BUT NOW WITH THE CHANGES.
SELECT      *
FROM        SESSION.TESTTABLE ;
EN

回答 1

Stack Overflow用户

发布于 2019-09-04 16:35:49

这里记录了i 7.4的WITH公共表表达式(CTE)

74/db2/rbafzintsel.htm

它显示您可以在CTE之后使用一个完整的选择。

更新记录在这里。

74/db2/rbafzupdt.htm

但是没有显示UPDATE可以使用CTE,尽管它确实说您可以更新一个(可更新的)视图,并且视图支持CTEs 74/db2/rbafzhcview.htm

MERGE的情况也是类似的

74/db2/rbafzmerge.htm

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57729426

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档