INSERT с GROUP BY в инструкции VALUE SELECT - ОШИБКА 1111 (HY000): недопустимое использование групповой функции

Я пытаюсь подсчитать различные значения после группировки по идентификатору, а затем вставляю их в другую таблицу со следующим запросом:

INSERT INTO table_aggregate
  (id_aggregate, aggregate_column)
(SELECT id_detail, COUNT(DISTINCT(detail_column))
  FROM table_detail
  GROUP BY id_detail)
ON DUPLICATE KEY UPDATE
  aggregate_column = COUNT(DISTINCT(detail_column));

При запуске получаю ошибку:

ОШИБКА 1111 (HY000): недопустимое использование групповой функции

Если я запускаю часть запроса SELECT, она работает нормально. Почему выдает эту ошибку?


person Jason Melo Hall    schedule 07.01.2017    source источник
comment
Вы хотите знать, почему он выдает ошибку, или вы хотите создать работающий запрос? Если последнее, см. meta.stackoverflow.com/questions/333952/   -  person Strawberry    schedule 07.01.2017
comment
Попробуйте VALUES(aggregate_column) в разделе ОБНОВЛЕНИЕ.   -  person Paul Spiegel    schedule 07.01.2017


Ответы (2)


Вы не можете использовать COUNT в разделе ОБНОВЛЕНИЕ. Вместо этого используйте VALUES(aggregate_column):

INSERT INTO table_aggregate
  (id_aggregate, aggregate_column)
(SELECT id_detail, COUNT(DISTINCT(detail_column))
  FROM table_detail
  GROUP BY id_detail)
ON DUPLICATE KEY UPDATE
  aggregate_column = VALUES(aggregate_column);

http://rextester.com/KTEDM89215

person Paul Spiegel    schedule 07.01.2017

Вы можете поместить агрегацию в подзапрос. Затем вы можете обратиться к вычисленному значению в update

INSERT INTO
    table_aggregate (id_aggregate, aggregate_column) 
    SELECT
        * 
    FROM
        (
            SELECT
                id_detail,
                COUNT(DISTINCT(detail_column)) AS count 
            FROM
                table_detail 
            GROUP BY
                id_detail 
        ) AS aggr 
ON DUPLICATE KEY 
UPDATE
    aggregate_column = aggr.count
person Philipp    schedule 07.01.2017
comment
Спасибо, я вижу, это сработало бы, но другой ответ был более кратким, так как не было необходимости создавать второй оператор SELECT. - person Jason Melo Hall; 12.01.2017