2016-01-07 7 views
0

Для кода ниже, я получаю следующее сообщение об ошибке от Oracle:Как просуммировать UNION ALL подзапросов в Oracle

«ORA-00923: FROM ключевое слово не найдено, где ожидается».

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 

Любые советы?

+1

Unrelated, но: 'distinct' это *** НЕ *** функция. 'distinct (product3)' абсолютно идентичен 'distinct product3' –

+4

Одна ошибка, которую я вижу: вы получили таблицу (объединение всех) не имеет столбца' productCount'. Имена столбцов объединения (только) определяются первым запросом, поэтому во внешнем запросе доступны столбцы «id1», «code1» и «productCount1». Но это действительно должно привести к другой ошибке. –

+2

Я думаю, что ваш внешний запрос имеет столбцы 'id' и' code', а ваш внутренний запрос объединения создает столбцы с именами 'name1' и' code1' на основе первого запроса в объединении. Это может быть проблемой .. вы можете попробовать переименовать первые внутренние столбцы запроса в 'id' и' code' и повторно запустить и посмотреть .. – vmachan

ответ

0

Следуйте этому коду.

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 

Я создал 3 таблицы для тестирования. Этот код работает без ошибок. Просто следуйте псевдониму столбца во внутреннем запросе, и имя столбца внешнего запроса будет таким же.

0

Запрос в вопросе не привел бы к заявленной ошибке, и следующее просто исправляет псевдонимы столбцов и использует разные.

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