2010-09-10 32 views
0

我需要從DB2 v8中的CTE(公用表表達式)中進行選擇,並將結果插入到表中。 爲V8的相關文件是很難第一眼就明白,但對V9有一個明顯的例子(http://publib.boulder.ibm.com/infocenter/dzichelp/v2r2/index.jsp?topic=/com.ibm.db29.doc.apsg/db2z_createcte.htm):帶有CTE的DB2 v8插入

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?

+0

在v8中支持CTE,並且[v8 INSERT文檔](http://publib.boulder.ibm.com/infocenter/db2luw/v8/index.jsp?topic=/com.ibm.db2.udb .doc/admin/r0000970.htm)與您發佈的查詢的格式相匹配。你沒有提到錯誤信息 - 你確定你的CTE和後續的SELECT實際上是否返回任何數據? – 2010-09-10 02:15:16

+0

您在哪個平臺上運行DB2? – 2010-09-10 04:08:20

+0

對不起,我沒有看到你的評論,認爲沒有答案。 原來,我們不打算支持v8,但如果內存服務,我得出的結論是INSERT在v8中並沒有與CTE一起工作。 – vaso 2010-12-14 00:43:01

回答

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) 
         ) 
); 
0

有一個簡單的解決方法是here允許您使用使用傳統WITH語句INSERT或UPDATE。這個黑客將適用於V8或更高版本的INSERT,以及V9或更高版本的UPDATE。

對於V8或更高版本,還有其他方法,通常使用子選擇,但由於它們的複雜性,我覺得它們是不實用的。