我需要从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编写?
答案 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或更高版本还有其他方法,通常使用子选择,但我发现它们由于其复杂性而不实用。