Как суммировать подзапрос UNION ALL в Oracle

Для приведенного ниже кода я получаю следующее сообщение об ошибке от 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

Любой совет?


person SChang    schedule 07.01.2016    source источник
comment
Не связано, но: distinct НЕ является функцией. distinct(product3) абсолютно идентичен distinct product3   -  person a_horse_with_no_name    schedule 08.01.2016
comment
Одну ошибку вижу: в вашей производной таблице (объединении all) нет столбца productCount. Имена столбцов объединения (только) определяются первым запросом, поэтому у вас есть столбцы id1, code1 и productCount1, доступные во внешнем запросе. Но на самом деле это должно дать другую ошибку.   -  person a_horse_with_no_name    schedule 08.01.2016
comment
Я думаю, что ваш внешний запрос имеет столбцы id и code, а ваш внутренний запрос на объединение создает столбцы с именами name1 и code1 на основе первого запроса в объединении. Это может быть проблемой.. вы можете попробовать переименовать первые внутренние столбцы запроса в id и code и повторно запустить и посмотреть..   -  person vmachan    schedule 08.01.2016
comment
Похоже, это не тот код, который вы действительно используете; он был изменен, чтобы скрыть ваши настоящие имена настолько, что вы потеряли то, что вызывает проблему? Можете ли вы убедиться, что ваш вопрос содержит код, который действительно вызывает это, если вы запустите его точно так, как показано?   -  person Alex Poole    schedule 08.01.2016
comment
Вы запускаете его с помощью инструмента, в котором пустые строки не допускаются в запросе? В этом случае сообщение об ошибке будет относиться только к части вашего опубликованного запроса. SQL*Plus был немного известен этим.   -  person Shannon Severance    schedule 08.01.2016
comment
Запуск того, что показано в SQL * Plus с отключенным sqlblanklines, приведет к получению ORA-00933; и любые дальнейшие пустые строки после окончательного ключевого слова select будут давать другие ошибки. В реальном коде все еще может быть эта проблема; или в сценарии может быть дополнительный код, который на самом деле является единственной выполняемой вещью.   -  person Alex Poole    schedule 08.01.2016


Ответы (2)


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

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 таблицы для тестирования. Этот код работает без ошибок. Просто следуйте псевдониму столбца во внутреннем запросе, и имя столбца внешнего запроса будет таким же.

person Md. Shamim Al Mamun    schedule 08.01.2016

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

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
person Paul Maxwell    schedule 08.01.2016