2016-01-07 2 views
0

Pour le code ci-dessous, je reçois le message d'erreur suivant Oracle:Comment puis-je SUM un UNION ALL Oracle sous-requête dans

"ORA-00923: mot clé FROM introuvable où prévu".

SELECT 
    t1.id, 
    t1.code, 
    SUM(t1.productCount) 
FROM 
    (SELECT 
     id1, 
     code1, 
     COUNT(DISTINCT(product)) as productCount1 
    FROM 
     table1 
    GROUP BY 
     id1, 
     code1 

    UNION ALL 

    SELECT 
     id2, 
     code2, 
     COUNT(DISTINCT(product2)) as productCount2 
    FROM 
     table2 
    GROUP BY 
     id2, 
     code2 

    UNION ALL 

    SELECT 
     id3, 
     code3, 
     COUNT(DISTINCT(product3)) as productCount3 
    FROM 
     table3 
    GROUP BY 
     id3, 
     code3) t1 
GROUP BY 
    t1.id, 
    t1.code 

Un conseil?

+1

non apparentés, mais: 'distinct' est *** *** pas une fonction. 'distinct (product3)' est absolument identique à 'product3 distinct ' –

+4

Une erreur que je peux voir: la table dérivée (l'union tout) n'a pas de colonne' productCount'. Les noms des colonnes d'une union sont (seulement) déterminés par la première requête, ainsi vous avez les colonnes 'id1',' code1' et 'productCount1' disponibles dans la requête externe. Mais cela devrait en fait donner une erreur différente. –

+2

Je pense que votre requête externe a des colonnes 'id' et' code' et votre requête union interne produit des colonnes avec les noms 'name1' et' code1' basés sur la première requête de l'union. Cela pourrait être le problème .. vous pouvez essayer de renommer les premières colonnes de requêtes internes à 'id' et' code' et relancer et voir .. – vmachan

Répondre

0

Suivez ce code.

CREATE TABLE TABLE1 
(
    ID1  NUMBER, 
    CODE1 NUMBER, 
    PRODUCT NUMBER 
); 

CREATE TABLE TABLE2 
(
    ID2  NUMBER, 
    CODE2  NUMBER, 
    PRODUCT2 NUMBER 
); 

CREATE TABLE TABLE3 
(
    ID3  NUMBER, 
    CODE3  NUMBER, 
    PRODUCT3 NUMBER 
); 

    SELECT 
     t1.id, 
     t1.code, 
     SUM(t1.productCount) 
    FROM 
     (SELECT id1 as id, 
     code1 as code, 
     COUNT(DISTINCT(product)) as productCount 
     FROM table1 
     GROUP BY id1, code1 
     UNION ALL 
     SELECT id2 as id, 
     code2 as code, 
     COUNT(DISTINCT(product2)) as productCount 
     FROM table2 
     GROUP BY id2, code2 
     UNION ALL 
     SELECT id3 as id, 
     code3 as code, 
     COUNT(DISTINCT(product3)) as productCount 
     FROM table3 
     GROUP BY id3, code3 
     ) t1 
    GROUP BY t1.id,t1.code 

J'ai créé 3 tables pour les tests. Ce code s'exécute sans erreur. Il suffit de suivre l'alias de la colonne dans la requête interne et le nom de la colonne de la requête externe sera le même.

0

La requête dans la question ne produirait pas l'erreur indiquée et la suivante corrige simplement pour les alias de colonne et pour l'utilisation de distinct.

SELECT 
     t1.idx 
    , t1.codex 
    , SUM(t1.productCount) 
FROM (
     SELECT 
      id1 AS idx 
      , code1 AS codex 
      , COUNT(DISTINCT product) AS productCount 
     FROM table1 
     GROUP BY 
      id1 
      , code1 
     UNION ALL 
      SELECT 
        id2 
       , code2 
       , COUNT(DISTINCT product2) 
      FROM table2 
      GROUP BY 
        id2 
       , code2 
     UNION ALL 
      SELECT 
        id3 
       , code3 
       , COUNT(DISTINCT product3) 
      FROM table3 
      GROUP BY 
        id3 
       , code3 
    ) t1 
GROUP BY 
     t1.idx 
    , t1.codex 
0
SELECT 
    id,code,SUM(productCount1) 

FROM 
    (SELECT 
     id1, 
     code1, 
     COUNT(DISTINCT(product)) as productCount1 
    FROM 
     table1 
    GROUP BY 
     id1, 
     code1 

UNION ALL 

SELECT 
    id2, 
    code2, 
    COUNT(DISTINCT(product2)) as productCount1 
FROM 
    table2 
GROUP BY 
    id2, 
    code2 

UNION ALL 

SELECT 
    id3, 
    code3, 
    COUNT(DISTINCT(product3)) as productCount1 
FROM 
    table3 
GROUP BY 
    id3, 
    code3) 
GROUP BY 
    id,code