2010-09-10 6 views
0

Je dois sélectionner une expression CTE (expression de table commune) dans DB2 v8 et insérer le résultat dans une table. La documentation pertinente pour v8 est difficile à comprendre au premier coup d'œil, mais pour v9 il est un exemple clair (http://publib.boulder.ibm.com/infocenter/dzichelp/v2r2/index.jsp?topic=/com.ibm.db29.doc.apsg/db2z_createcte.htm):Insertion DB2 v8 avec CTE

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

Il ne fonctionne pas dans v8 cependant. Comment devrait-il être écrit en v8?

+0

Les CTE sont pris en charge dans in v8, et la [documentation INSERT v8] (http://publib.boulder.ibm.com/infocenter/db2luw/v8/index.jsp?topic=/com.ibm.db2.udb .doc/admin/r0000970.htm) correspond au format de la requête que vous avez publiée. Vous ne mentionnez pas de message d'erreur - êtes-vous sûr que votre CTE et le SELECT suivant renvoient des données? –

+0

Sur quelle plateforme exécutez-vous DB2? –

+0

Désolé les gars, je n'ai pas vu vos commentaires, supposé qu'il n'y avait pas de réponse. Il s'est avéré que nous n'allions pas prendre en charge la v8 de toute façon, mais si ma mémoire est bonne, j'en suis venu à la conclusion que INSERT ne fonctionnait pas avec CTE dans v8. – vaso

Répondre

0

écrire comme un patron

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

Il y a une solution simple here qui vous permet d'utiliser une instruction INSERT ou UPDATE selon un procédé classique WITH. Ce hack fonctionnera pour INSERT sur V8 ou supérieur, et pour UPDATE sur V9 ou supérieur.

Il existe d'autres méthodes pour V8 ou plus, en utilisant typiquement des sous-sélections, mais je trouve qu'elles ne sont pas pratiques en raison de leur complexité.