带有CTE的DB2 v8插入

时间:2010-09-10 01:53:39

标签: db2 expression

我需要从DB2 v8中的CTE(公用表表达式)中进行选择,并将结果插入到表中。 乍一看很难理解v8的相关文档,但对于v9,有一个明确的例子(http://publib.boulder.ibm.com/infocenter/dzichelp/v2r2/index.jsp?topic=/com.ibm.db29.doc.apsg/db2z_createcte.htm):

INSERT INTO vital_mgr (mgrno)
WITH VITALDEPT (deptno, se_count)  AS
(
     SELECT deptno, count(*)
     FROM DSN8910.EMP
     WHERE job = 'senior engineer'
     GROUP BY deptno
)
SELECT    d.manager
FROM      DSN8910.DEPT d
         , VITALDEPT s
WHERE     d.deptno = s.deptno
          AND s.se_count  >  (
               SELECT  AVG(se_count)
               FROM    VITALDEPT
          );

虽然它在v8中不起作用。 应该如何用v8编写?

2 个答案:

答案 0 :(得分:0)

把它写成老板

INSERT INTO vital_mgr 
(
    SELECT d.manager
    FROM SN8910.DEPT AS d
        INNER JOIN 
            (
                SELECT deptno, count(*)
                FROM DSN8910.EMP
                WHERE job = 'senior engineer'
                GROUP BY deptno
            ) AS s (deptno, se_count)
                ON d.deptno = s.deptno
    WHERE s.se_count > (
                            SELECT AVG(se_count)
                            FROM
                                (
                                    SELECT deptno, count(*)
                                    FROM DSN8910.EMP
                                    WHERE job = 'senior engineer'
                                    GROUP BY deptno
                                ) AS VITALDEPT (deptno, se_count)
                       )
);

答案 1 :(得分:0)

有一个简单的解决方法here,允许您使用传统的WITH语句来使用INSERT或UPDATE。此hack适用于V8或更高版本的INSERT,以及V9或更高版本的UPDATE。

V8或更高版本还有其他方法,通常使用子选择,但我发现它们由于其复杂性而不实用。