代码之家  ›  专栏  ›  技术社区  ›  vaso

带有cte的db2 v8 insert

  •  0
  • vaso  · 技术社区  · 15 年前

    我需要从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 回复  |  直到 9 年前
        1
  •  0
  •   Stradivariuz    15 年前

    像老板一样写

    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)
                           )
    );
    
        2
  •  0
  •   JPistone    14 年前

    有一个简单的解决方法 here 它允许您使用常规的WITH语句来使用插入或更新。这项技术将适用于V8或更高版本的Insert,以及V9或更高版本的更新。

    V8或更大的其他方法,通常使用子选择,但是由于它们的复杂性,我发现它们是不实用的。